- MySQL 中最适合该数据的数据类型是什么?
- Java Bean(POJO)类中应该使用什么数据类型?
- 如何使用javax验证/约束来验证该数据类型的长度和仅允许数字?
字符串和VARCHAR。
不要尝试将电话号码存储为实际数字。这会破坏格式,删除前导0和其他不良内容。
如果选择,可以将用户输入限制为仅数字值,但即使在这种情况下,也将持久化后备数据保留为字符/字符串而不是数字。
在尝试实施任何长度限制、验证或掩码(如XXX-XXXX-XX)之前,请注意广泛的世界及其数字长度和格式的差异。
非数字字符可能在电话号码中有效。一个主要例子是“+”代替国际号码开头的“00”。
从评论对话编辑而来:
在MySQL中,INT(10)并不意味着一个10位数,它意味着一个显示宽度为10个数字的整数。在MySQL中,INT的最大值是2147483647(如果无符号则为4294967295)。
您可以使用BIGINT代替INT将其存储为数字。相较于VARCHAR(10),使用BIGINT每行可节省3个字节。
如果你想分别存储"国家+区域+号码",尝试使用VARCHAR(20)。这允许您适当地存储国际电话号码,如果有这种需要的话。
字符串
一个简单的正则表达式。参见:如何在Java中检测一个字符串是否只包含数字。使用javax.constraints.Pattern。
在数据库中,长度大约为15-20的VARCHAR类型足够使用,并且是最佳选项。因为您可能需要在电话号码中使用各种连字符和加号。
这完全取决于您的需求。如果您正在开发一个小型应用程序并且仅覆盖特定地区(目标受众),则可以选择BIGINT仅存储数字,因为VARCHAR消耗的字节比BIGINT多(具有最佳内存使用设计很重要)。但是,如果您正在开发大型应用程序并且面向全球用户,并且拥有足够的数据库能力来存储数据,则绝对可以选择VARCHAR。
电话号码的最佳数据类型是ulong,为什么呢? varchar和string类型是用于字符的,当您想在其上进行搜索时,SQL会按位进行操作。 long虽然也不错,但不是最好的,因为它包含负数。 因此,ulong类型是数字模型,不包含负数。
这是我导师推荐的数据库方案。
我的需求是在jsp中显示10位电话号码。以下是我的设置。
MySQL: numeric(10)
Java端:
@NumberFormat(pattern = "#")
private long mobileNumber;
它起作用了!
0
)开头,如果您尝试保存数字而不是文本,则可能会丢失。电话号码与数字有关是较大的UI错误之一。更好的方法是将其视为地址并对待它们,这更接近于它们实际上是什么和代表什么。 - indivisibleVARCHAR
是最合适的,但原因不在于此答案所提到的。问题是关于存储而不是格式。电话号码应该在存储之前转换为E.164。在这种格式下不存在以0
开头的电话号码,因此如果您删除起始的+
符号(您可以在从数据库获取后添加),则可以将其存储为BIGINT
。唯一的缺点是 - 部分输入电话号码时更难搜索。但优点是 - 占用的字节数较少,MySQL工作速度更快。 - Ruslan Stelmachenko+
或-
甚至前导0
?当您可以高效地使用smallint
作为dialcode
和longint
作为number
,从而最小化空间并提高选择性能时,为什么要这样做呢? - Ali Kleit