zoukankan      html  css  js  c++  java
  • mysql 由decimal 引起的 Warning: Data truncated for column

    今天在使用python 库mysqldb的rawsql的时候遇到一个问题(其实并不是mysqlbean引起的)

    cls.raw_sql('update {table} set available_amount=available_amount+%s, update_time=%s '
                        'where user_id=%s'.format(table=Points.Meta.table), amount, now, user_id)

    这里我在数据库里面的available_amount字段类型是decimal(16, 2),然后这里更新的时候amount的类型也是decimal,精度同样是精确到小数点后面两位。

    但是这里有个问题,在mysql下decimal如果跟string类型做加减法 会报出warning。

    在很多情况下,我们使用的orm级别在数据库曝出warning的时候就会中止运行

    错误复现:

    mysql> update temporary set amount = amount+'0.01' where id=1;
    Query OK, 1 row affected, 1 warning (0.00 sec)
    Rows matched: 1  Changed: 1  Warnings: 1
    
    mysql> show warnings;
    +-------+------+---------------------------------------------+
    | Level | Code | Message                                     |
    +-------+------+---------------------------------------------+
    | Note  | 1265 | Data truncated for column 'amount' at row 1 |
    +-------+------+---------------------------------------------+
    1 row in set (0.00 sec)

    为什么会造成这种情况, 因为尝试在mysql里面传递带引号的数字符串会被转成double类型。使用double类型可能会丢失精度在和decimal相加的时候。所以会报出warning

    这种情况只会在字符串数 会丢失精度的情况下报出,所以有时候会出现时有时无的报错信息。

    所以避免这种情况的办法就是让decimal直接加浮点型,或者直接使用  

    cast('12.22' as decimal(16, 2))

    转换成一样的类型,再相加减同样可以解决这个问题。

    希望能对同样遇到坑的盆友有所帮助。

  • 相关阅读:
    vue中的$event
    vue实现div拖拽互换位置
    关于marquee首次加载出现闪跳问题
    微信小程序之深色模式下样式的写法
    html动态添加公共页头和页脚
    微信小程序改变上一页面的数据,页面中的通信
    mui中的a标签无效和click无法点击的问题
    mui.DtPicker is not a constructor解决方案
    mui-slider选项卡设置默认index
    flutter环境配置遇到的一些坑
  • 原文地址:https://www.cnblogs.com/piperck/p/5808432.html
Copyright © 2011-2022 走看看