哪个是MySQL中电话号码的最佳数据类型,它的Java类型映射应该是什么?

我在我的Web应用程序中使用带有Spring JDBC模板的MySQL。 我需要存储只有数字(10)的电话号码。 我对使用数据类型的数据类型有点困惑。

  1. MySQL中它的首选数据类型是什么?
  2. Bean(POJO)类中的Java数据类型应该是什么?
  3. 如何使用javaxvalidation/约束来validation该数据类型的长度,并且只允许数字?

字符串和VARCHAR。

  • 不要尝试将电话号码存储为实际号码。 它会破坏格式化,删除前面的0秒和其他不受欢迎的东西。

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

  • 在尝试实施任何类型的长度限制,validation或掩码(例如XXX-XXXX-XX)之前,请注意更广泛的世界以及它们的数字长度和格式如何不同。

  • 非数字字符在电话号码中有效。 一个典型的例子是+作为国际号码开头的00的替代品。

在评论中的对话中编辑:

  • 这是电话号码与数字有关的更大的UI错误之一。 考虑和处理它们就像地址一样好得多,它比电话“数字”更接近它们的实际和代表。

在MySQL中 – > INT(10)不是指10位数字,它表示显示宽度为10位的整数。 MySQL中INT的最大值是2147483647(如果是无符号,则为4294967295)。

您可以使用BIGINT而不是INT将其存储为数字。 使用BIGINT将在VARCHAR(10)上每行节省3个字节。

如果要分别存储“国家/地区+号码”。 尝试使用VARCHAR(20)。 这使您能够在需要时正确存储国际电话号码。

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

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

  1. VARCHAR
  2. 一个简单的正则表达式。 请参阅: 如何检查字符串是否仅包含Java中的数字 。 使用javax.constraints.Pattern。

你可以使用var-char,String和int,它取决于你,如果你只使用带有手机号码的国家代码而不是你可以使用int,如果你使用特殊的格式编号而不是使用String或var-char类型,如果你使用var-char然后必须玷污数字大小并限制用户。

大概15-20长度的VARCHAR就足够了,并且是数据库的最佳选择。 由于您可能需要各种连字符和加号以及您的电话号码。

在mysql中:BIGINT。 在java:Long。

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

Java方面:

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

它工作了!

这完全取决于您的要求。 如果您正在开发一个小规模的应用程序并且只覆盖特定区域(目标受众),您可以选择BIGINT仅存储数字,因为VARCHAR比BIGINT消耗更多的字节(具有最佳的内存使用设计问题)。 但如果您正在开发大型应用程序并以全球用户为目标,并且您有足够的数据库function来存储数据,那么您绝对可以选择VARCHAR。