mysql 如何在SQL中将电话号码存储为整数?

idfiyjo8  于 2023-04-28  发布在  Mysql
关注(0)|答案(3)|浏览(157)

在MySQL中,我使用以下代码构建了一个表:

BUILD TABLE user
(
    userName char(25) NOT NULL PRIMARY KEY,
    firstName char(25) NOT NULL,
    lastName char(25) NOT NULL,
    userEmail char(25) NOT NULL,
    userPhone int(10) NOT NULL,
);

假设我执行以下命令:

INSERT INTO `user`(`userName`, `firstName`, `lastName`, `userEmail`, `userPhone`) 
VALUES ("JDoe","John","Doe","jdoe@nothing.net", 9725550145)

MySQL运行命令没有问题,并将信息放在表中。然而,当我检索上述无名氏的信息时,他的电话号码显示为2147483647。
在一些条目中,我注意到如果他们的区号的第一个数字大于2,那么他们得到相同的数字。我做错了什么,我该如何修复这个问题,以便每个人都有自己的电话号码,而不是MySQL分配给他们的这个看似随机的值?
非常感谢。

vbopmzt1

vbopmzt11#

不要这样做,电话号码是而不是整数,理由很充分:

  • 前导零:0199857514
  • 国家代码:+34199857514
  • 特殊命令:#992,514
  • SIP电话:sip:01199857514@stackoverflow.net

如果你打算将电话号码存储为整数,那么你以后会遇到很大的限制和问题。

  • 回答您的问题:* 您不能将电话号码存储为整数,必须使用字符串。
q3aa0525

q3aa05252#

将列userPhone int(10) NOT NULL更改为userPhone BIGINT NOT NULL
如果您需要更改列类型,请使用以下命令:

ALTER TABLE user MODIFY userPhone BIGINT NOT NULL;

另外,花点时间阅读MySql文档中的数字类型
http://dev.mysql.com/doc/refman/5.7/en/numeric-types.html
正如在评论中指出的那样,你不应该使用数字类型来存储电话号码,因为有一些电话号码以0开头,如果它被存储为一个数字,你将丢失这些信息。由@GolezTrol和@GordonLinoff指出

xghobddn

xghobddn3#

尽管Guillame完全错误的答案已经被接受了九年,电话号码可以而且应该被存储为数字。
他举的反例没有一个是正确的。
首先,回应他关于电话号码不能存储在号码中的说法:
1.电话命令不是电话号码的一部分。你不妨试着在他们的邮寄地址中照顾一个不和谐的句柄。数据库不携带替代数据集。
1.国际国家代码中没有加号。是的,欧洲人就是这么写的,但是把你的手机拿出来,试着拨加号。让我知道当你弄清楚如何,并发送给我一些指示,请。电话号码中也没有破折号或括号。只有数字。
1.当然,你不应该在你的电话号码栏中存储SIP电子邮件地址。那不是电话号码。
1.电话号码没有前导零。Guillame可能不知道这一点,但这是一个国家的呼叫命令。如果你去了另一个国家,你就不必再拨它了,即使电话号码没有改变。因此,它实际上不是电话号码的一部分。所以,举个例子,如果我从德国给我的加拿大朋友打电话,我必须先拨零。但如果我从加拿大、美国、墨西哥或法国打电话给他们,我就不必这样做了。为什么?因为电话号码***从定义上来说从来不会以零***开头。唯一的例外是美国/加拿大呼叫前缀到操作员。这是一百多年前建立这个系统的国际电话系统协议的一部分。
所以。
为什么要这么做?
好吧。

  • 可以规范化的数据应该规范化。
  • 如果你能用三种不同的方式写同一个电话号码,那就有问题了。
  • 所给出的示例是0199857514。
  • 如果你从欧洲拨,你会接到乌兹别克斯坦。欧洲是地球上唯一一个拨号模式有效的地方,所以我认为Guillame是欧洲人,而且没有足够的旅行来了解其他地方的电话是如何工作的。
  • 如果你从美国或加拿大拨打,你会在第一个数字后得到一个接线员,因为拨0会得到接线员。
  • 在游轮上,第二个数字后就报警了。
  • 在日本,你会被挂断电话,因为09是系统前缀的开头(美国人会认为是X11号码,如411或611),而有091和095,没有099。
  • 在中国,你得到一个快速忙碌,因为开始与01呼叫是从来没有正确的在中国在任何情况下
  • 这里的根本问题是,在欧洲,在电话号码前拨01是电话系统的命令,而实际上不是电话号码的一部分;正确解析的号码有(01是命令)(998是国家代码)(57514)是实际的本地电话号码。
  • 正确的完整电话号码是99857514。它***不包括外部拨号前缀01,该前缀是指向Guillame本地电话系统的命令。***
  • 这个数字从美国的1开始,从日本的010开始,从中国的001开始等等。在美国,拨打该号码的方式因网络而异;移动电话、传统固定电话和ESS 6+固定电话都以不同的方式呼叫该号码。你以为我在开玩笑吗问一个来自亚特兰大的人,他必须知道他们使用的是哪个电话运营商才能知道如何拨打国际电话,因为一个要求1前缀,另一个禁止。
  • 为什么正常化很重要?
  • 这是一个数据库社区。这应该是显而易见的。
  • Guillame写的是0199857514。我写1199857514。我的中国朋友写的是0010199857514。我的日本朋友写的是010199857514。
  • 该客户由日本销售团队负责,因此在数据库中为010199857514。我是美国销售团队的一员,我试着去拜访客户。他们在欧洲,所以他们说他们的号码是0199857514。我找了找不到。作为一个美国人,我接下来尝试1199857514和110199857514,但它们不在那里。我不知道日本的符号。系统错误地告诉我这个电话号码没有在使用中,所以我创建了一个新的客户记录并附加到那个。
  • 客户现在在数据库中两次使用两个不同的电话号码。记录正在丢失。双重收费开始了。记录的内容没有得到尊重,因为我们看到的是错误的用户副本。
  • 外键和唯一约束一样容易被违反。
  • “但应用程序不应该必须格式化与本地电话规则!“当然应该。就像你不会把日期作为字符串来跟踪一样,在输入和输出的过程中格式化它们。就像欧洲人写AA/BB/CCCC,美国人写BB/AA/CCCC,日本人写CCCC/BB/AA。这是本地格式问题,您无法将本地格式合并到数据中。
  • 产品展示
  • 如果你没有停止阅读“这会导致你的数据不正确”,你就太过分了
  • 但是,天哪,你真的想在索引上进行字符串比较而不是整数比较?

为了正确地完成这项工作,您必须删除国家控制代码,因为它不是电话号码的一部分,并且在不同的国家工作方式不同
您不应该在电话号码列中存储不属于电话号码的内容,例如PBX命令和SIP电子邮件地址
电话号码***应***存储为数字

相关问题