我不能完全掌握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。
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(13,4)。这意味着该列的总大小为13位,其中4位将用于精确表示。
因此,总的来说,该列的最大值为:999999999.9999
评论中有正确的解决方案,但把它们总结成一个答案:
你必须使用DECIMAL(6,4)。
然后你可以有6位数字,小数点(刻度)前2位,小数点后4位。至少根据这个是这样的。
推荐文章
- 如何使用MySQL DECIMAL?
- 警告用户/local/mysql/data目录不属于mysql用户
- 添加一个复合主键
- 无法添加或更新子行:外键约束失败
- 如何从本地机器mysqldump远程数据库
- 如何正确地创建复合主键- MYSQL
- 仅在Datetime列上按日期分组
- 在MySQL数据库中存储货币值的最佳数据类型
- 如何自定义'显示进程列表'在mysql?
- MySQL删除一些外键
- 用MySQL LEFT JOIN删除行
- MySQL - length() vs char_length()
- 使用PDO进行行计数
- 在Mac上安装MySQL后,使用ALTER USER语句重置MySQL root密码
- my.cnf文件在macOS上的位置