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

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

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

  • 相关阅读:
    day06作业
    day04_ATM项目说明书
    ATM+购物车基本思路流程
    装饰器、迭代器、生成器、递归、匿名函数、面向过程编程、三元表达式6
    day05函数部分
    自制七段数码管源码
    字符串格式化
    字符串表示
    格式化输出
    python入门——列表类型、元组、字典类型
  • 原文地址:https://www.cnblogs.com/piperck/p/5808432.html
Copyright © 2011-2022 走看看