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))

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

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

  • 相关阅读:
    PHP之html~01
    常用的html标签大全
    PHP从PHP5.0到PHP7.1的性能全评测
    PHP的性能演进(从PHP5.0到PHP7.1的性能全评测)
    Unix及类Unix系统文本编辑器的介绍
    keychain 的学习
    开发中遇到的一些问题
    IOS 照片浏览器总结(思想步骤)
    IOS 应用管理(九宫格) 总结笔记
    IOS 集成友盟分享
  • 原文地址:https://www.cnblogs.com/piperck/p/5808432.html
Copyright © 2011-2022 走看看