MySQL DECIMAL 数据类型
简介:在本教程中,我们将向您介绍MySQL DECIMAL数据类型以及如何在数据库表中有效地使用它。
MySQL DECIMAL数据类型简介
MySQL DECIMAL数据类型用于在数据库中存储精确的数值。我们经常将DECIMAL数据类型用于保留精确精度的列,例如会计系统中的货币数据。 要定义数据类型为DECIMAL的列,请使用以下语法:column_name DECIMAL(P,D);在上面的语法中:
- P是表示有效位数的精度。P的范围是1到65。
- D是表示小数点后的位数的刻度。D的范围是0和30.MySQL要求D小于或等于(<=)P。
DECIMAL(P,D)
意味着列可以存储多达D位的P位数。十进制列的实际范围取决于精度和比例。
除了DECIMAL
关键字,您也可以使用DEC
,FIXED
或者NUMERIC
因为他们是同义词DECIMAL
。
像INT数据类型,DECIMAL
类型也有UNSIGNED
和ZEROFILL
属性。如果我们使用 UNSIGNED
属性,则列DECIMAL UNSIGNED
不会接受负值。
如果我们使用ZEROFILL
,MySQL会将显示值填充0,直到列定义指定的显示宽度。另外,如果我们使用ZERO FILL
的DECIMAL
列,MySQL将在列自动添加 UNSIGNED
属性。
以下示例使用DECIMAL
数据类型定义amount列。
amount DECIMAL(6,2);在这个例子中,amount列可以存储6个数字,带有2个小数位; 因此,量列的范围是9999.99到-9999.99。 MySQL允许我们使用以下语法:
column_name DECIMAL(P);这相当于:
column_name DECIMAL(P,0);在这种情况下,列不包含小数部分或小数点。 另外,我们甚至可以使用以下语法。
column_name DECIMAL;在这种情况下,P的默认值为10。
MySQL DECIMAL存储
MySQL分别为整数和小数部分分配存储空间。MySQL使用二进制格式来存储DECIMAL
值。它将9位数字打包成4个字节。
对于每个部分,需要4个字节来存储9个数字的每个倍数。剩余数字所需的存储空间如下表所示:
剩下的数字 | 字节 |
---|---|
0 | 0 |
1-2 | 1 |
3-4 | 2 |
5-6 | 3 |
7-9 | 4 |
DECIMAL(19,9)
小数部分有9位数,整数部分有19-9 = 10位数。小数部分需要4个字节。整数部分对于前9位需要4个字节,对于1个剩余数字,它需要1个以上的字节。总的来说,DECIMAL(19,9)
列需要9个字节。
MySQL DECIMAL数据类型和货币数据
我们经常将DECIMAL
数据类型用于货币数据,如价格,工资,帐户余额等。如果您设计一个处理货币数据的数据库,则以下语法应没问题。
amount DECIMAL(19,2);但是,如果您要遵守公认会计原则(GAAP)规则,则货币列必须至少包含4个小数位,以确保舍入值不超过0.01美元。在这种情况下,您应定义具有4个小数位的列,如下所示:
amount DECIMAL(19,4);
MySQL DECIMAL数据类型示例
首先,创建一个新表名为materials
三个字段分别:id,description和cost。
CREATE TABLE materials ( id INT AUTO_INCREMENT PRIMARY KEY, description VARCHAR(255), cost DECIMAL(19 , 4 ) NOT NULL );其次,将数据插入
materials
表中。
INSERT INTO materials(description,cost) VALUES('Bicycle', 500.34),('Seat',10.23),('Break',5.21);第三,从表中查询数据
materials
。
SELECT * FROM materials;
+----+-------------+----------+ | id | description | cost | +----+-------------+----------+ | 1 | Bicycle | 500.3400 | | 2 | Seat | 10.2300 | | 3 | Break | 5.2100 | +----+-------------+----------+ 3 rows in set (0.00 sec)第四,修改cost列以包含
ZEROFILL
属性。
ALTER TABLE materials MODIFY cost DECIMAL(19,4) zerofill;五,再次查询材料表。
SELECT * FROM materials;
+----+-------------+----------------------+ | id | description | cost | +----+-------------+----------------------+ | 1 | Bicycle | 000000000000500.3400 | | 2 | Seat | 000000000000010.2300 | | 3 | Break | 000000000000005.2100 | +----+-------------+----------------------+ 3 rows in set (0.00 sec)如您所见,我们在输出值中填充了许多零。 在本教程中,我们展示了有关MySQL DECIMAL数据类型的详细信息,并向您展示了如何将其应用于存储精确数字数据(如财务数据)的列。