您的位置:首页 > 数据库 > MySQL

MySQL数据类型DECIMAL用法

2017-06-30 10:17 495 查看
MySQL
DECIMAL
数据类型用于在数据库中存储精确的数值。我们经常将
DECIMAL
数据类型用于保留准确精确度的列,例如会计系统中的货币数据。

要定义数据类型为
DECIMAL
的列,请使用以下语法:

column_nameDECIMAL(P,D);

在上面的语法中:

P
是表示有效数字数的精度。
P
范围为
1〜65


D
是表示小数点后的位数。
D
的范围是
0
~
30
。MySQL要求
D
小于或等于(
<=
)
P


DECIMAL(P,D)
表示列可以存储
D
位小数的
P
位数。十进制列的实际范围取决于精度和刻度。

与INT数据类型一样,
DECIMAL
类型也具有
UNSIGNED
ZEROFILL
属性。如果使用
UNSIGNED
属性,则
DECIMALUNSIGNED
的列将不接受负值。

如果使用
ZEROFILL
,MySQL将把显示值填充到
0
以显示由列定义指定的宽度。另外,如果我们对
DECIMAL
列使用
ZEROFILL
,MySQL将自动将
UNSIGNED
属性添加到列。

以下示例使用
DECIMAL
数据类型定义的一个叫作
amount
的列。

amountDECIMAL(6,2);

在此示例中,
amount
列最多可以存储
6
位数字,小数位数为
2
位;因此,
amount
列的范围是从
-9999.99
9999.99


MySQL允许使用以下语法:

column_nameDECIMAL(P);

这相当于:

column_nameDECIMAL(P,0);

在这种情况下,列不包含小数部分或小数点。

此外,我们甚至可以使用以下语法。

column_nameDECIMAL;

在这种情况下,
P
的默认值为
10


MySQLDECIMAL存储

MySQL分别为整数和小数部分分配存储空间。MySQL使用二进制格式存储
DECIMAL
值。它将
9
位数字包装成
4
个字节。

对于每个部分,需要
4
个字节来存储
9
位数的每个倍数。剩余数字所需的存储如下表所示:

剩余数字
00
1–21
3–42
5–63
7-94
例如,
DECIMAL(19,9)
对于小数部分具有
9
位数字,对于整数部分具有
19
位=
10
位数字,小数部分需要
4
个字节。整数部分对于前
9
位数字需要
4
个字节,
1
个剩余字节需要
1
个字节。
DECIMAL(19,9)
列总共需要
9
个字节。

MySQLDECIMAL数据类型和货币数据

经常使用
DECIMAL
数据类型的货币数据,如价格,工资,账户余额等。如果要设计一个处理货币数据的数据库,则可参考以下语法-

amountDECIMAL(19,2);

但是,如果您要遵守公认会计原则(GAAP)规则,则货币栏必须至少包含
4
位小数,以确保舍入值不超过
$0.01
。在这种情况下,应该定义具有
4
位小数的列,如下所示:

amountDECIMAL(19,4);

MySQLDECIMAL数据类型示例

首先,创建一个名为
test_order
的新表,其中包含三列:
id
description
cost


CREATETABLEtest_order( idINTAUTO_INCREMENTPRIMARYKEY, descriptionVARCHAR(255), costDECIMAL(19,4)NOTNULL );

  

第二步,将资料插入test_order表。

INSERTINTOtest_order(description,cost) VALUES('Bicycle',500.34),('Seat',10.23),('Break',5.21);


第三步,从test_order表查询数据。

SELECT*fromtest_order


第四步,更改
cost
列以包含
ZEROFILL
属性。

ALTERTABLEtest_order
MODIFYcostDECIMAL(19,4)zerofill;


第五步,再次查询test_order表。

SELECT*fromtest_order

如上所见,在输出值中填充了许多零。

因为zerofill,当我们插入负值会报错:

INSERTINTOtest_order(description,cost)
VALUES('test',-100.11);

提示:
[SQL]INSERTINTOtest_order(description,cost)
VALUES('test',-100.11)

[Err]1264-Outofrangevalueforcolumn'cost'atrow1


  

其它插入测试结论:

当数值在其取值范围之内,小数位多了,则四舍五入后直接截断多出的小数位。

若数值在其取值范围之外,则直接报Outofrangevalue错误。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: