MySQL中电话号码的最佳数据类型是什么?对应Java的数据类型应该是什么?

97
我正在为我的网络应用程序使用Spring JDBC模板与MySQL。我需要存储只有数字(10位)的电话号码,并且对于使用的数据类型有些困惑。
  1. MySQL 中最适合该数据的数据类型是什么?
  2. Java Bean(POJO)类中应该使用什么数据类型?
  3. 如何使用javax验证/约束来验证该数据类型的长度和仅允许数字?
11个回答

112

字符串和VARCHAR。

  • 不要尝试将电话号码存储为实际数字。这会破坏格式,删除前导0和其他不良内容。

  • 如果选择,可以将用户输入限制为仅数字值,但即使在这种情况下,也将持久化后备数据保留为字符/字符串而不是数字。

  • 在尝试实施任何长度限制、验证或掩码(如XXX-XXXX-XX)之前,请注意广泛的世界及其数字长度和格式的差异。

  • 非数字字符可能在电话号码中有效。一个主要例子是“+”代替国际号码开头的“00”。

从评论对话编辑而来:

  • 将电话号码与数字相联系是较大的UI错误之一。更好的做法是将其视为地址,并像处理地址一样进行处理,这更接近它们实际上是和代表的内容。

1
我个人会将其限制为仅包含[0-9]、空格或连字符“-”。让用户按照他们喜欢的方式进行格式化。至少在早期开发中,数字格式化不会是我的主要功能之一。 - indivisible
1
你的国家使用区号吗?人们是否会想要保存来自国外的号码?这些号码以零(0)开头,如果您尝试保存数字而不是文本,则可能会丢失。电话号码与数字有关是较大的UI错误之一。更好的方法是将其视为地址并对待它们,这更接近于它们实际上是什么和代表什么。 - indivisible
+1 我很欣赏你使用字符串/varchar的论点。我看到其他人推荐数字数据类型,但似乎即使是扩展或诸如此类的东西也是不允许的(并且需要另一列...为简单起见,我只使用varchar...感谢您的文章... - twknab
1
我同意VARCHAR是最合适的,但原因不在于此答案所提到的。问题是关于存储而不是格式。电话号码应该在存储之前转换为E.164。在这种格式下不存在以0开头的电话号码,因此如果您删除起始的+符号(您可以在从数据库获取后添加),则可以将其存储为BIGINT。唯一的缺点是 - 部分输入电话号码时更难搜索。但优点是 - 占用的字节数较少,MySQL工作速度更快。 - Ruslan Stelmachenko
1
“这是较大的UI错误之一”,将数据存储在SQL中与UI有什么关系?当您可以将它们存储为数字(拨号代码,号码),同时在客户端格式化它们时,为什么要存储不必要的字符+-甚至前导0?当您可以高效地使用smallint作为dialcodelongint作为number,从而最小化空间并提高选择性能时,为什么要这样做呢? - Ali Kleit
显示剩余4条评论

30

在MySQL中,INT(10)并不意味着一个10位数,它意味着一个显示宽度为10个数字的整数。在MySQL中,INT的最大值是2147483647(如果无符号则为4294967295)。

您可以使用BIGINT代替INT将其存储为数字。相较于VARCHAR(10),使用BIGINT每行可节省3个字节。

如果你想分别存储"国家+区域+号码",尝试使用VARCHAR(20)。这允许您适当地存储国际电话号码,如果有这种需要的话。


21

考虑使用E.164格式,为了获得完整的国际支持,您需要使用15位数字的VARCHAR。

有关电话号码本地化的更多信息,请参见Twilio的建议


3
E.123的区别是什么? - nowox
@nowox 你可以在网上搜索是否有答案。 - Jonathan J. Pecany
超过15——你引用的“15”不包括国际前缀。 - Rick James
正要提到这个。如果您想存储+前缀,那么它将是16。 - kevinivan05

5

3

在数据库中,长度大约为15-20的VARCHAR类型足够使用,并且是最佳选项。因为您可能需要在电话号码中使用各种连字符和加号。


1
你可以使用var-char、String和int,这取决于你的需求。如果你只使用国家代码和手机号,则可以使用int;如果你使用特殊格式的号码,则应使用String或var-char类型;如果你使用var-char,则必须定义号码的大小并限制用户输入。

0

这完全取决于您的需求。如果您正在开发一个小型应用程序并且仅覆盖特定地区(目标受众),则可以选择BIGINT仅存储数字,因为VARCHAR消耗的字节比BIGINT多(具有最佳内存使用设计很重要)。但是,如果您正在开发大型应用程序并且面向全球用户,并且拥有足够的数据库能力来存储数据,则绝对可以选择VARCHAR。


0

电话号码的最佳数据类型是ulong,为什么呢? varchar和string类型是用于字符的,当您想在其上进行搜索时,SQL会按位进行操作。 long虽然也不错,但不是最好的,因为它包含负数。 因此,ulong类型是数字模型,不包含负数。


1
这个回答似乎问了与原帖相同的问题。整数类型不适合存储电话号码,因为一些电话号码包含非数字字符,并且可能有前导0。 - Robert Rapplean

-2
  1. 字符串
  2. 可变长度字符串

这是我导师推荐的数据库方案。


-2

我的需求是在jsp中显示10位电话号码。以下是我的设置。
MySQL: numeric(10)

Java端:

@NumberFormat(pattern = "#")  
private long mobileNumber;

它起作用了!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接