2011-01-29 33 views
122

我无法完全理解MySQL的DECIMAL。我需要该行能够包含从00.0001到99.9999之间的任意数字。我将如何构造它以像这样工作?如何使用MySQL DECIMAL?

+8

*(参考)* http://dev.mysql.com/doc/refman/5.1/en/precision-math-decimal-changes.html –

+4

你应该真的接受正确的答案。目前接受的答案是错误的。 – Olhovsky

+2

在这里结束并阅读声明DECIMAL UNSIGNED不可能的答案。请参阅下面的新答案,了解正确的规格。 –

回答

344

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

DOUBLE实际上只是一个双精度(64位而不是32位)版本的FLOAT。浮点数是real numbers的近似表示,它们不是精确的。实际上,像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的更多信息,official docs始终是一个很好的资源。

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

+15

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

+2

是的,你是对的。请注意,这是MySQL 5.0.3以上的工作,http://dev.mysql.com/doc/refman/5.1/en/precision-math-examples.html – ajreal

+0

@ajreal - 你能修改你的答案吗?提前致谢。 – dezso

5

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

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

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

32

虽然上面的答案似乎是正确的,但只是一个简单的解释,让你知道它是如何工作的。

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

所以,总之,对于列,你将有一个最大值:999999999,9999

7

有在评论中正确的解决方案,但将它们聚合成一个单一的答案:

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

然后你可以有6个总位数,前2个和后4个小数点(比例)。至少根据this

+1

这帮助我完全理解了这个概念。 –