mysql数据库在无符号双字段中保存负零
我想将货币值保存在mysql db-curreny_数据表中。因此,我创建了一个sale\u price字段,它是一个双无符号的。当我要保存负值时,db生成一个错误并保存默认值零(0)。但是当我要保存负零(-0)时,它会成功地保存。我很困惑。求你了,我需要帮助mysql数据库在无符号双字段中保存负零,mysql,Mysql,我想将货币值保存在mysql db-curreny_数据表中。因此,我创建了一个sale\u price字段,它是一个双无符号的。当我要保存负值时,db生成一个错误并保存默认值零(0)。但是当我要保存负零(-0)时,它会成功地保存。我很困惑。求你了,我需要帮助 通常,您可能应该使用“十进制”来存储货币,而不是双精度: 我很好奇你为什么相信-0“成功保存”: a) 您能在双精度值中看到符号位吗 b) 或者您只是没有看到错误异常 无论哪种方式-有什么区别?为了数钱,零不总是零吗 通常不存在无符号双
通常不存在无符号双精度:请参阅。我建议您使用标准格式(一般来说,货币也可以有负值) 我会检查是否出现负值错误(例如,-1):我认为MySQL将-0视为0,并允许它使用无符号双精度(尽管-0和0通常有两种不同的表示) 编辑:
IEE 754标准规定-0和0应被视为相等(即0=-0应保持不变)这不是很明显吗?无符号double(假设存在这种类型)只接受无符号,即非负的double值。MySQL非常聪明,知道-0与0相同,因此它允许您将-0放入字段中。OTOH,负数(根据字段的定义)是不允许的,所以您会得到一个错误 如果将字段重新定义为
十进制
类型请注意一些奇怪之处:
-where子句中的0=0,但不是group by。
并且-0通过mysqldump/restore在0中转换(可能会导致从机出现问题…)
(您还可以通过一些计算得出-0)
我发现自己正在尝试清除这些,这并不容易,因为您无法搜索“where COL=-0”
最终我还是这样做了:
确定受影响的列:
select * from testnegzero where cast(n as char(20))="-0";
+------+
| n |
+------+
| -0 |
+------+
清理它们:
update testnegzero set n=0 where cast(n as char(20))="-0";
select * from testnegzero ;
+------+
| n |
+------+
| 0 |
| 0 |
+------+
是的,它成功地保存了-0,减号在那里,我看到了。我尝试了其他的负值,然后它生成了一个错误,但没有使用-0。这就是我感到困惑的原因。我想使用double,因为我的值包含浮点值。e、 g.4.50我读了你的链接paulsm4,谢谢你,这对我很有帮助,所以现在我可以使用十进制作为我的货币字段。
select * from testnegzero where cast(n as char(20))="-0";
+------+
| n |
+------+
| -0 |
+------+
update testnegzero set n=0 where cast(n as char(20))="-0";
select * from testnegzero ;
+------+
| n |
+------+
| 0 |
| 0 |
+------+