mysql数据库在无符号双字段中保存负零

mysql数据库在无符号双字段中保存负零,mysql,Mysql,我想将货币值保存在mysql db-curreny_数据表中。因此,我创建了一个sale\u price字段,它是一个双无符号的。当我要保存负值时,db生成一个错误并保存默认值零(0)。但是当我要保存负零(-0)时,它会成功地保存。我很困惑。求你了,我需要帮助 通常,您可能应该使用“十进制”来存储货币,而不是双精度: 我很好奇你为什么相信-0“成功保存”: a) 您能在双精度值中看到符号位吗 b) 或者您只是没有看到错误异常 无论哪种方式-有什么区别?为了数钱,零不总是零吗 通常不存在无符号双

我想将货币值保存在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 |
    +------+