如何使用MySQL DECIMAL?


176

我不太了解MySQL的DECIMAL。我需要该行能够包含从00.0001到99.9999之间的任何数字。我将如何构建这样的结构?



4
您应该真正接受正确的答案。当前接受的答案是错误的。
Olhovsky

2
在这里结束并阅读答案,声称不可能使用DECIMAL UNSIGNED。有关正确的规格,请参见下面的最新答案。
Markus AO

Answers:


439

双列一样的DECIMAL列,你会遇到麻烦,如果你使用双列的财务数据。

DOUBLE实际上只是FLOAT的双精度(64位而不是32位)版本。浮点数是实数的近似表示,并不精确。实际上,像0.01这样的简单数字在FLOAT或DOUBLE类型中没有确切的表示形式。

DECIMAL列是精确的表示形式,但是它们占用的空间更多,而可能的数字范围更小。要创建一个能够保存从0.0001到99.9999的值的列,就像您要求的那样,您需要以下语句

CREATE TABLE your_table
(
    your_column DECIMAL(6,4) NOT NULL
);

列定义如下格式DECIMAL(M,d)其中,中号是数字的最大数(精度)和d是位小数点(右边的数尺度)。

这意味着前面的命令将创建一列,该列接受-99.9999到99.9999之间的值。您也可以创建一个UNSIGNED DECIMAL列,范围从0.0000到99.9999。

有关MySQL DECIMAL的更多信息,官方文档始终是一个很好的资源。

请记住,所有这些信息对于MySQL 5.0.3及更高版本都是正确的。如果使用的是以前的版本,则确实应该升级。


17
投票给你答案。您的答案是正确的,另一个答案却不正确(因为它声称“ double = decimal”)。DECIMAL是具有精确值的定点类型,其同义词为NUMERIC,DEC和FIXED。不是DOUBLE,因为DOUBLE是表示近似数值数据值的浮点类型。使用DECIMAL(<1-65>,<0-30>)时,第一个参数是数字位数,第二个参数是小数点右边的位数。
诺伯特2012年

2
是的,你是对的。需注意,是MySQL 5.0.3工作起,dev.mysql.com/doc/refman/5.1/en/precision-math-examples.html
ajreal

1
张贴者要求保留一个小数值字段,该字段的值介于0.0001和99.9999之间。我添加了一些额外的信息来阐明创建的字段实际上支持从-99.9999到99.9999的值。感谢您的反馈!还添加了MySQL版本免责声明。
Alex Recarey

1
您说“无法创建“无符号” DECIMAL列”,但是您的代码示例指示“ DECIMAL(6,4)UNSIGNED NOT NULL”。为什么是这样?
liang

3
@AlexRecarey我似乎可以创建DECIMAL UNSIGNED了;并且MySQL 5.x手册同意:DECIMAL[(M[,D])] [UNSIGNED] [ZEROFILL]。它将为负值返回超出范围的错误。您也可以创建未签名的FLOAT和DOUBLE。手册:dev.mysql.com/doc/refman/5.0/en/numeric-type-overview.html
Markus AO

64

尽管上面的答案似乎是正确的,但只需简单的说明就可以了解其工作原理。

假设您的栏设为DECIMAL(13,4)。这意味着该列的总大小为13位,其中4位将用于精确表示。

因此,总而言之,该列的最大值为: 999999999.9999


1

15

注释中有正确的解决方案,但将它们总结为一个答案:

您必须使用DECIMAL(6,4)。

然后,您可以有6位数字,小数点前2位和小数点后4位(小数位)。至少按照这个


6

MySQL 5.x 十进制数据类型的规范是:DECIMAL[(M[,D])] [UNSIGNED] [ZEROFILL]。上面的答案是错误的,说无符号的十进制数是不可能的。

要定义一个仅允许无符号小数的字段,该字段的总长度为6位数字,其中4位为小数,请使用:DECIMAL (6,4) UNSIGNED

您也可以创建无符号(即非负)的FLOAT和DOUBLE数据类型。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.