【问题标题】:Value being inserted as 2147483647 into database值作为 2147483647 插入数据库
【发布时间】:2014-03-31 16:07:52
【问题描述】:

我尝试输入数据库的所有电话号码都被插入为2147483647

数据库字段是integer(11)

在插入电话号码之前,它会通过以下代码来删除所有空格、破折号和括号:

if (!empty($hphone)) $phone = $hphone;
else if (!empty($HomePhone)) $phone = $HomePhone;
else if (!empty($Phone1)) $phone = $Phone1;
$phone = preg_replace("/[^0-9]/", "", $phone);

为什么每次都插入2147483647的电话号码,不管电话号码是什么?

【问题讨论】:

  • 将电话号码存储为字符串 (varchar),而不是整数。
  • @zerkms 这显然不能解决他的问题
  • @Damien Black:你的假设是基于什么?
  • @scarhand 你能显示设置 $hphone 的代码吗?
  • 我认为问题在于它试图将其存储为字符串,尽管它是一个整数。从插入查询中的值中删除单引号会纠正这个问题,还是我需要通过 PHP 将其转换为整数?

标签: php mysql integer


【解决方案1】:

如果可以,请将电话号码转换为 VARCHAR 字段,不要将其存储为有符号(或无符号)数值(int、bigint、double 等...)。

在这种情况下,MySQL 中已签名 INT 的限制为 2147483647 是导致您出现问题的原因。插入此字段的任何较大的值都将被限制为该最大值。

例如,如果电话号码 555-555-5555 大于该限制 (5555555555 >2147483647),则存储它会导致最大值 2147483647。

我还建议不要将其存储为 BIG INT 或任何其他数字类型。您将如何处理扩展或特殊编码字符,例如:

   +02 112020 10020  
   1-333-232-9393 x203

顺便说一句:不知道第一个是不是真正的非美国数字格式,但你明白了

此外,无论号码有多大,带有相关前导 0 的电话号码都会丢失一些:

 021-392-9293

应该是数字 213929293

【讨论】:

  • “任何更大的东西都会被封顶” --- ...除非你设置更严格的sql_mode
  • @zerkms 好点,它可以拒绝它,但许多人不喜欢这种严格程度。
  • 确实如此。有太多人更喜欢“垃圾数据”而不是“无数据”:-)
  • 是的,我已将其更改为 VARCHAR。这完全有道理。谢谢你,zerkms,以及所有做出贡献的人。
  • @Ray,国际电话簿号码显示的标准非常接近您的标准。北美号码类似于+1.212.555.1212,其中国家代码以+ 开头。例如,英国号码可能是 +44.800.999.9999
【解决方案2】:

如果要将其存储为数字,请使用 bigint,因为 int 的最大值等于 2147483647。

因此,您尝试存储的任何高于 2147483647 的数字都将存储为 2147483647。

这里有一些mysql类型的参考:

http://dev.mysql.com/doc/refman/5.0/en/integer-types.html

【讨论】:

    猜你喜欢
    • 2019-06-20
    • 2016-02-12
    • 2012-09-10
    • 1970-01-01
    • 2019-10-13
    • 1970-01-01
    • 2018-11-10
    相关资源
    最近更新 更多