我不能完全掌握MySQL的十进制。我需要该行能够包含从00.0001到99.9999之间的任何数字。我该如何安排它工作呢?


当前回答

DOUBLE列与DECIMAL列不同,如果对财务数据使用DOUBLE列,将会遇到麻烦。

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)格式,其中M是最大位数(精度),D是小数点右边的位数(刻度)。

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

例如,如果您想要一个列接受从-9999.99到9999.99的值,命令将是DECIMAL(6,2)。如您所见,您仍然使用6的精度,但只允许2的刻度。

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

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

MySQL 8.0.17+更新

对于FLOAT、DOUBLE和DECIMAL列,不建议使用Unsigned。

其他回答

DOUBLE列与DECIMAL列不同,如果对财务数据使用DOUBLE列,将会遇到麻烦。

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)格式,其中M是最大位数(精度),D是小数点右边的位数(刻度)。

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

例如,如果您想要一个列接受从-9999.99到9999.99的值,命令将是DECIMAL(6,2)。如您所见,您仍然使用6的精度,但只允许2的刻度。

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

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

MySQL 8.0.17+更新

对于FLOAT、DOUBLE和DECIMAL列,不建议使用Unsigned。

MySQL 5。decimal [(M[,D])] [UNSIGNED] [ZEROFILL]。上面的答案是错误的(现在更正),说无符号小数是不可能的。

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

您也可以创建unsigned(即unsigned)。不是负的)FLOAT和DOUBLE数据类型。


更新MySQL 8.0.17+,如在MySQL 8手动:11.1.1数字数据类型语法:

"允许UNSIGNED属性的数值型数据类型也允许SIGNED。但是,这些数据类型在默认情况下是带符号的,因此signed属性没有任何作用 从MySQL 8.0.17开始,对于FLOAT、DOUBLE和DECIMAL(以及任何同义词)类型的列,UNSIGNED属性已弃用;你应该期望在MySQL的未来版本中删除对它的支持。考虑使用一个简单的CHECK约束来代替这样的列。

评论中有正确的解决方案,但把它们总结成一个答案:

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

然后你可以有6位数字,小数点(刻度)前2位,小数点后4位。至少根据这个是这样的。

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

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

因此,总的来说,该列的最大值为:999999999.9999