【问题标题】:MySQL Configuration to auto truncate decimal valueMySQL配置自动截断十进制值
【发布时间】:2017-02-08 11:26:04
【问题描述】:

我有一个带有 DECIMAL(9,2) 字段的表,我有 2 台服务器同时运行 mysql 5.7

如果我运行这段代码

INSERT INTO `money_accounts` (`balance`) VALUES (9999999999.99);

在其中一个服务器上它被插入并且值被截断,在另一个服务器上它引发Out of range value for column balance 错误。

我的问题是,使这种情况发生的配置值是什么?或者为什么它发生在一台服务器上而不是另一台服务器上?

【问题讨论】:

    标签: mysql


    【解决方案1】:

    如果我们阅读文档:http://dev.mysql.com/doc/refman/5.7/en/out-of-range-and-overflow.html

    当 MySQL 在数值列中存储一个值时 列数据类型的允许范围,结果取决于 当时有效的 SQL 模式

    如果启用严格的 SQL 模式,MySQL 会拒绝超出范围的值 有错误,插入失败,按照SQL 标准。

    如果没有启用限制模式,MySQL 会将值剪辑到 范围的适当端点并存储结果值 而是。

    所以这意味着你应该设置必要的sql模式,当超出范围错误发生时不会失败。

    没有关于那个的配置参数。

    同样问题的解决我们可以看到here 表示禁用STRICT_TRANS_TABLESSTRICT_ALL_TABLES 模式可以解决您的问题。

    【讨论】:

      【解决方案2】:

      定义

      DECIMAL(9,2)
      

      表示总计位的9位精度,小数点后位有2位。价值

      9999999999.99
      

      共有 12 位精度,小数点后有 2 位。因此,该值超出范围。理所当然地,MySQL 在这两种情况下都应该抛出一个超出范围的错误。在它“有效”的情况下,我的猜测是发生了截断。

      顺便说一句,您应该使用DECIMAL(12,2) 或更宽的值来存储问题中的值。

      更新:

      为什么您的一个服务器正在插入而另一个失败,一个可能的解释是第一个服务器关闭了传统模式。在两台服务器上运行以下命令:

      SELECT @@SESSION.sql_mode
      

      如果你看到输出看起来像

      STRICT_TRANS_TABLES, STRICT_ALL_TABLES, ...
      

      然后服务器以传统模式运行,这意味着它不会截断但会拒绝。要关闭它,请尝试运行

      SET SESSION sql_mode=''
      

      他们的插入应该成功(截断)。但无论如何,您不应该在生产中依赖截断。如果您需要更高的精度,请加宽列。

      参考:Automatically trimming length of string submitted to MySQL

      【讨论】:

      • 是的..我知道,问题是为什么它在联合国服务器上工作,我想知道导致自动截断的配置值,我无法在 mysql 变量或文档中找到它.
      猜你喜欢
      • 2021-10-12
      • 2013-12-30
      • 2010-09-23
      • 2016-04-22
      • 1970-01-01
      • 2014-03-25
      • 1970-01-01
      • 2015-05-04
      • 1970-01-01
      相关资源
      最近更新 更多