我在我的Web应用程序中使用带有Spring JDBC模板的MySQL。我需要存储只有数字(10)的电话号码。我对使用数据类型的数据类型感到困惑。
答案 0 :(得分:50)
Strings& VARCHAR。
请勿尝试将电话号码存储为实际号码。它会破坏格式,删除前面的0
和其他不受欢迎的东西。
如果您选择,您可以将用户输入限制为仅数字值,但即使在这种情况下,也要将支持持久数据保留为字符/字符串而不是数字。
在尝试实施任何类型的长度限制,验证或掩码(例如XXX-XXXX-XX)之前,请注意更广阔的世界以及它们的数字长度和格式不同。
非数字字符在电话号码中有效。一个主要的例子是+
,作为国际号码开头的00
的替代。
在评论中的对话中编辑:
答案 1 :(得分:12)
在MySQL中 - > INT(10)不是指10位数字,它表示显示宽度为10位的整数。 MySQL中INT的最大值是2147483647(如果是无符号,则为4294967295)。
您可以使用BIGINT而不是INT将其存储为数字。运用 BIGINT将在VARCHAR(10)上为每行节省3个字节。
如果您想分别存储“国家/地区+号码”。尝试使用VARCHAR(20)。这使您能够在需要时正确存储国际电话号码。
答案 2 :(得分:4)
考虑使用E.164格式。要获得完整的国际支持,您需要一个15位的VARCHAR。
有关电话号码本地化的详细信息,请参阅Twilio's recommendation。
答案 3 :(得分:2)
字符串
一个简单的正则表达式。见:How to check if a string contains only digits in Java。使用javax.constraints.Pattern。
答案 4 :(得分:1)
你可以使用var-char,String和int,它取决于你,如果你只使用带有移动号码的国家代码而不是你可以使用int,如果你使用特殊的格式编号而不是使用String或var-char类型,如果你使用var-char,那么必须玷污数字大小并限制用户。
答案 5 :(得分:0)
大约15-20长度的VARCHAR就足够了,并且是数据库的最佳选择。因为你可能需要各种连字符和加号以及你的电话号码。
答案 6 :(得分:0)
在mysql中:BIGINT。 在java:Long。
答案 7 :(得分:0)
这完全取决于您的要求。如果您正在开发小型应用程序并且仅覆盖特定区域(目标受众),则可以选择BIGINT仅存储数字,因为VARCHAR比BIGINT消耗更多的字节(具有最佳的内存使用设计问题)。但是,如果您正在开发大型应用程序并面向全球用户,并且您具有足够的数据库功能来存储数据,则可以选择VARCHAR。
答案 8 :(得分:0)
这是我的导师推荐的对数据库的看法
答案 9 :(得分:-1)
我的要求是在jsp中显示10位电话号码。所以这是给我的设置。
MySQL:numeric(10)
Java Side:
@NumberFormat(pattern = "#")
private long mobileNumber;
成功了!