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


71

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

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

Answers:


81

字符串和VARCHAR。

  • 不要尝试将电话号码存储为实际号码。它将破坏格式,删除前面0的和其他不良内容。

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

  • 在尝试实施任何长度限制,验证或掩码(例如XXX-XXXX-XX)之前,请了解更广阔的世界以及它们的数字长度和格式有何不同。

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

通过评论中的对话进行编辑:

  • 电话号码与数字有关是用户界面错误较大的错误之一。最好把它们当作地址来考虑和对待,它比电话“号码”更接近其实际代表的内容。

如果有人会阅读,您可能也不想限制字符。不同的国家/地区有不同的约定,并且过度阅读C国家/地区中的数字很可能会认识到C国家/地区某人输入时所使用的约定。
yshavit 2014年

我个人将其限制为[0-9],空格或连字符-。让用户随意设置格式。至少在早期开发中-数字格式在我的功能列表中不会很高。
2014年

但是假设我只想要数字..而且我的系统也只能用于一个国家..那么?
Vishal Zanzrukia 2014年

1
VARCHAR最适合但不是出于此答案中提到的原因的同意。问题是关于存储,而不是格式化。在存储之前,电话号码应转换为E.164。不存在可以0以此格式开头的电话号码,因此,如果删除起始+符号(可以从DB提取后添加),则可以将其存储为BIGINT。唯一的缺点-那时很难通过部分输入的电话号码进行搜索。但是优点是-它占用更少的字节并且MySQL工作更快。
Ruslan Stelmachenko

1
“这是UI的最大错误之一”,当您可以将它们存储为数字(拨号代码,数字),而又希望在客户端格式化它们时,在sql中存储数据又与UI有什么关系?为什么存储不必要的字符+或者-甚至是领先的0时候可以有效地利用smallintdialcode,并longint用于number从而最大限度地减少空间,提高了选择性能?
阿里·克莱特

19

在MySQL中,> INT(10)并不表示10位数字,而是表示显示宽度为10位数字的整数。MySQL中INT的最大值为2147483647(如果未签名,则为4294967295)。

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

如果要存储“国家+地区+数字”。尝试使用VARCHAR(20)。这样,您可以在需要时正确存储国际电话号码。




3

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


1

您可以使用var-char,String和int,这取决于您,如果仅使用带有移动号码的国家代码,则可以使用int;如果对数字使用特殊格式,则不能使用String或var-char类型。使用var-char,则必须删除number的大小并限制用户。


0

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


0
  1. Varchar

这是我的导师推荐的对数据库的看法


-1

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

Java端:

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

而且有效!


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.