【问题标题】:Telephone number changed to 2147483647? How to represent telephone numbers?电话号码改成2147483647?如何表示电话号码?
【发布时间】:2014-07-07 14:42:16
【问题描述】:

所以,我创建了一个数据表,要求用户提供移动服务提供商 (varchar)、电话号码和密码。该表似乎运行良好,除了当用户输入电话号码时,原始号码转换为 2147483647。我花了一些时间环顾四周,我了解到这是因为我的表超出了 32 位限制。为了解决这个问题,我需要在 MYSQL 数据库中使我的整数限制大于 10(我最初拥有的)。

我已经使用 PhpMyAdmin 更改了 MYSQL 表;但是,我仍然遇到同样的问题。这是因为我现在需要在 Yii 端更改一些东西吗?

我知道我可以使用 CRUD 来构建新的 MVC 关系 - 但我已经在模型和控制器中添加了很多功能。 Yii 有没有办法以零碎的方式更改我的数据库? IE。无需使用 Crud?

【问题讨论】:

  • 存储编号为 varchar。
  • 从上一个答案中检查一下,它被转换为 2147483647 stackoverflow.com/questions/23550231/…
  • 电话号码从来没有,也永远不会是“整数”。如果您坚持继续使用 int,则使用 bigint,它是 64 位数据类型。一个未签名的大整数最多可以将 18,446,744,073,709,551,616 表示为“电话号码”
  • 只有在你认为数学有意义的情况下才使用整数。您是否需要对电话号码执行任何数学运算?不,因此它应该存储为字符串,而不是整数。

标签: php mysql telephony integer-overflow


【解决方案1】:

尽管电话簿号码 (DN) 类似于整数,但使用任意宽度的整数来存储 DN 确实是非常糟糕的做法。

这是因为,正如您所发现的,被当作整数来操作的 DN 有时会被破坏。

使用 32 位号码存储北美拨号计划号码(加拿大、加勒比海地区、美国)完全不正确。在 429 区号中途,即使您设法使用无符号整数,您的号码也会损坏。

使用 varchar(20) 就可以了。

这里有一些事情需要考虑:ITU-T 建议 E.123 用于表示电话号码。 http://en.wikipedia.org/wiki/E.123

【讨论】:

    【解决方案2】:

    INT 仍然是一个 32 位数字,INT(10) 中的 (10) 是一个人工上限,主要用于说明 ZEROFILL 应该填充多远。

    试试BIGINT(10),因为这将允许所有 10 位数字,即使是那些高于 231-1

    【讨论】:

      猜你喜欢
      • 2023-02-20
      • 2016-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-09
      • 1970-01-01
      • 2023-03-22
      相关资源
      最近更新 更多