【问题标题】:When I insert "'50261111111s11", it inserts 2147483647 instead [duplicate]当我插入“'50261111111s11”时,它会插入 2147483647 [重复]
【发布时间】:2014-06-26 11:31:56
【问题描述】:

当我运行这个时:

INSERT INTO `orders` (`order_id`) VALUES ('50261111111s11');

以下内容被插入:

order_id => 2147483647

字段 order_id 是一个 INT 类型,所以我假设这是根本原因。我不明白为什么它将它转换为那个数字。我通常希望它插入一个 0,因为我在那里使用了一个字母字符。什么给了?

【问题讨论】:

  • 刚刚在这里回答stackoverflow.com/questions/23550231/… 所以不要添加重复的。
  • 这个数字在我看来是 2G...
  • 您的列order_id 未设置为varchar 列,而是设置为int 列或其他一些数字类型。 或者你需要使用bigint
  • @AbhikChakraborty - 感谢您没有添加不必要的重复信息。我希望其他人也同样自律。
  • 道歉!显然有人在这个问题上比我早了 2 小时!

标签: mysql


【解决方案1】:

首先,字符串'50261111111s11'implicitly coerced502611111111

那么它的上限是21474836472,也就是MySQL中的maximum value for an INT field

(除非订单 ID 一个受约束的整数,例如自增键,也许它应该是一个 CHAR/VARCHAR 列?)


1INSERT statement

如果表达式的类型与列的类型不匹配,这可能涉及 [隐式] 类​​型转换,并且给定值的转换可能会根据数据类型导致不同的插入值。

(MySQL 可能实现对 INT 的直接转换/截断,但考虑提供的值为 CONVERT("50261111111s11", SIGNED INTEGER) 的情况 - 结果是 50261111111,而不是 0。)

2来自11.2.6 Out-of-Range and Overflow Handling

  • 如果启用严格的 SQL 模式,MySQL 会根据 SQL 标准拒绝超出范围的值并出错,插入失败。

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

【讨论】:

    【解决方案2】:

    您正在插入一个字符串 ... VALUES ('50261111111**s**11') 在 int 字段中,您应该将 order_id 更改为 varchar

    【讨论】:

    • 这没有回答所提出的问题。
    • 大声抱歉,是的,我当时没有正确阅读......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-20
    • 1970-01-01
    • 1970-01-01
    • 2014-03-31
    • 2019-04-20
    • 2014-07-16
    • 1970-01-01
    相关资源
    最近更新 更多