【发布时间】:2014-08-12 18:37:56
【问题描述】:
我正在为我的 Web 应用程序使用带有 Spring JDBC 模板的 MySQL。我需要存储只有数字(10)的电话号码。我对使用数据类型的数据类型有点困惑。
- 在 MySQL 中哪种数据类型更适合它?
- 为此,Bean (POJO) 类中的 Java 数据类型应该是什么?
- 如何使用 javax 验证/限制长度以及仅允许数字来验证该数据类型?
【问题讨论】:
标签: java mysql phone-number digit
我正在为我的 Web 应用程序使用带有 Spring JDBC 模板的 MySQL。我需要存储只有数字(10)的电话号码。我对使用数据类型的数据类型有点困惑。
【问题讨论】:
标签: java mysql phone-number digit
字符串和 VARCHAR。
不要尝试将电话号码存储为实际号码。它会破坏格式,删除前面的0s 和其他不受欢迎的东西。
如果您愿意,您可以将用户输入限制为仅限数值,但即使在这种情况下,您也可以将支持的持久数据保留为字符/字符串而不是数字。
在尝试实施任何类型的长度限制、验证或掩码(例如 XXX-XXXX-XX)之前,请了解更广阔的世界以及它们的数字长度和格式有何不同。
非数字字符可以在电话号码中有效。一个典型的例子是 + 代替国际号码开头的 00。
编辑自 cmets 中的对话:
【讨论】:
-。让用户随意格式化。至少在早期开发中 - 数字格式在我的功能列表中不会很高。
0) 开头,如果您尝试保存数字而不是文本,则会丢失。电话号码与数字有任何关系是更大的 UI 错误之一。像地址一样思考和践踏它们要好得多,它更接近它们的实际含义和代表。
VARCHAR 最合适,但不是出于此答案中提到的原因。问题是关于 storage 而不是格式化。电话号码在存储前应转换为E.164。不存在可以以这种格式以0 开头的电话号码,因此如果您删除以+ 开头的符号(您可以在从数据库获取后添加),那么您可以将其存储为BIGINT。唯一的缺点 - 很难通过部分输入的电话号码进行搜索。但它的优势 - 它占用更少的字节并且 MySQL 工作得更快。
smallint 用于dialcode 和longint 用于number 从而最小化空间并提高选择性能时,为什么还要存储不必要的字符+ 或- 甚至是前导0?
字符串
一个简单的正则表达式。请参阅:How to check if a string contains only digits in Java。使用 javax.constraints.Pattern。
【讨论】:
长度可能为 15-20 的 VARCHAR 就足够了,并且是数据库的最佳选择。因为您可能需要各种连字符和加号以及您的电话号码。
【讨论】:
你可以使用var-char、String和int,这取决于你,如果你只使用带有手机号码的国家代码而不是你可以使用int,如果你对数字使用特殊的格式而不是使用String或var-char类型, 如果你使用 var-char 则必须破坏数字的大小并限制用户。
【讨论】:
考虑使用E.164 格式。要获得全面的国际支持,您需要一个 15 位数字的 VARCHAR。
有关电话号码本地化的更多信息,请参阅Twilio's recommendation。
【讨论】:
在 MySQL 中 -> INT(10) 不表示 10 位数字,它表示显示宽度为 10 位的整数。 MySQL 中 INT 的最大值为 2147483647(如果无符号,则为 4294967295)。
您可以使用 BIGINT 而不是 INT 将其存储为数字。使用 BIGINT 将比 VARCHAR(10) 每行节省 3 个字节。
如果要分别存储“国家+地区+号码”。尝试使用 VARCHAR(20)。这使您能够在需要时正确存储国际电话号码。
【讨论】:
在 mysql 中:BIGINT。 在 java 中:长。
【讨论】:
我的要求是在 jsp 中显示 10 位电话号码。所以这是我的设置。
MySQL:numeric(10)
Java 端:
@NumberFormat(pattern = "#")
private long mobileNumber;
它成功了!
【讨论】:
这一切都基于您的要求。如果您正在开发小型应用程序并且仅覆盖特定区域(目标受众),您可以选择 BIGINT 仅存储数字,因为 VARCHAR 比 BIGINT 消耗更多字节(具有最佳内存使用设计很重要)。但是如果你正在开发一个大型应用程序并针对全球用户,并且你有足够的数据库能力来存储数据,那么你绝对可以选择 VARCHAR。
【讨论】:
这是我导师推荐的我对数据库的看法
【讨论】: