【问题标题】:MySQL different integer datatype operationMySQL不同的整数数据类型操作
【发布时间】:2015-06-17 03:26:47
【问题描述】:

有不同的数据类型用于在 MySQL 表中构建列。例如 SMALLINTMEDIUMINTINT。我了解不同的数据类型会根据列类型影响表大小。因此,没有必要将 UNSIGNED INT 分配给介于 0-1000 之间的值。

如果在 MySQL 中将不同数据类型的值相乘会发生什么(例如 SMALLINT * INT)?您需要什么 MySQL 数据类型来存储结果?

【问题讨论】:

  • hmm.. 我同意您应该在整个列中使用一致的整数类型?算术溢出怎么办?
  • 对不起,我刚刚回答了我自己的问题。我找到了解决方案here。那么,我应该放弃这个问题吗?还是自己写一个答案?
  • 如果您愿意,可以回答您的问题或删除您的问题
  • 如果您找到了自己问题的答案,您可以发布答案。但是,我建议您编辑您的问题以使其更清楚。
  • 知道了。谢谢大家!

标签: mysql sql sqldatatypes


【解决方案1】:

MySQL 为算术运算定义了一些规则。

  • +-* 的情况下,如果两个操作数都是整数(例如SMALLINTINT),则结果计算为BIGINT(64 位)精度

  • 如果两个操作数都是整数并且其中任何一个都是UNSIGNED,则结果是一个无符号整数。对于减法(-),如果启用NO_UNSIGNED_SUBTRACTION SQL 模式,则会对结果进行签名。

  • 如果+-/*% 的任何操作数是实数(例如FLOATDOUBLE)或字符串值(例如@ 987654340@) 结果的精度是精度最高的操作数的精度。

在具有不同数据类型的列之间进行算术运算是安全的。 MySQL 会自动转换成合适的格式。

至于存储其结果,有一些限制。

  • 如果插入超出范围的值,将存储最大端点(例如,将 130 插入TINYINT 将存储 127 并发出警告)。如果启用严格模式,插入将失败并引发错误。

  • 整数溢出导致静默回绕(例如 9223372036854775807 + 1 = -9223372036854775808。这是因为它是使用 BIGINT 数据类型的最大可能操作)。

  • 当为浮点或定点列分配的值超出指定(或默认)精度和小数位数所暗示的范围时,MySQL 存储表示该范围对应端点的值

  • 浮点溢出产生NULL 结果。某些操作可能会导致 +INF-INF 或 `NaN'。

  • DECIMAL 数据类型,如果溢出,将被截断。并发出警告。

参考资料(来自dev.mysql.com):

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-20
    相关资源
    最近更新 更多