mysql的float类型很奇怪的
uid,one,two,uid是int类型,自增,one字段是float(3,2) two字段是float(5,2).
按照道理one字段我可以插入 123.12 这样的数字对吧,也就是前面三位,后面两位
two字段我可以插入前面5位,后面两位吧,但是我插入一条
insert into test values(null,123.12,12345.12) 插入成功了,但是显示的数据则不一样,这是为什么呢
如果我需要插入数值 98.12,即前面2位,小数点两位,这个字段是应该设置成float类型吗
回复讨论(解决方案)
1、你定义错了
MySQL允许使用非标准语法:FLOAT(M,D)或REAL(M,D)或DOUBLE PRECISION(M,D)。这里,“(M,D)”表示该值一共显示M位整数,其中D位位于小数点后面。例如,定义为FLOAT(7,4)的一个列可以显示为-999.9999。MySQL保存值时进行四舍五入,因此如果在FLOAT(7,4)列内插入999.00009,近似结果是999.0001。
2、有精度要求应使用
DECIMAL和NUMERIC类型在MySQL中视为相同的类型。它们用于保存必须为确切精度的值,例如货币数据。当声明该类型的列时,可以(并且通常要)指定精度和标度;例如:
salary DECIMAL(5,2)
在该例子中,5是精度,2是标度。精度表示保存值的主要位数,标度表示小数点后面可以保存的位数。
1、你定义错了
MySQL允许使用非标准语法:FLOAT(M,D)或REAL(M,D)或DOUBLE PRECISION(M,D)。这里,“(M,D)”表示该值一共显示M位整数,其中D位位于小数点后面。例如,定义为FLOAT(7,4)的一个列可以显示为-999.9999。MySQL保存值时进行四舍五入,因此如果在FLOAT(7,4)列内插入999.00009,近似结果是999.0001。
2、有精度要求应使用
DECIMAL和NUMERIC类型在MySQL中视为相同的类型。它们用于保存必须为确切精度的值,例如货币数据。当声明该类型的列时,可以(并且通常要)指定精度和标度;例如:
salary DECIMAL(5,2)
在该例子中,5是精度,2是标度。精度表示保存值的主要位数,标度表示小数点后面可以保存的位数。
恩,明白了,谢谢徐版,那比如货币存储的时候必须要正数,不能为负数,这里数据库里面可以直接来限制吗,还是通过PHP正则来限制。我试了可以直接插入负数,比如 -91.22 这样的值,mysql可以限制只能存储正数吗
一个字段 salary DECIMAL(5,2) 这样的一个字段插入的值,也就是最大位数是前面3位,后面2位,必须这样,比如插入 123.12就可以,如果插入123456这样的就不行,虽然也是5位,但是没有两位小数点后面的。
123456 保存在 DECIMAL(5,2) 就是 12345.00 当然就越界了
DECIMAL(5,2) 只能保存 -999.99 ~ 999.99
货币存储的时候必须要正数,这是什么道理
负数不行吗?表示欠款
要限制正数应该设置UNSIGNED属性。
建议用decimal字段表示
上一篇: 第1章数据库理论基础知识习题