我在我的Web应用程序中使用带有Spring JDBC模板的MySQL。我只需要存储数字(10)。我对使用数据类型的数据类型有些困惑。
- 在MySQL中,首选的数据类型是什么?
- 为此,Bean(POJO)类中的Java数据类型应该是什么?
- 如何使用javax验证/约束来验证数据类型的长度,并且只允许数字?
我在我的Web应用程序中使用带有Spring JDBC模板的MySQL。我只需要存储数字(10)。我对使用数据类型的数据类型有些困惑。
Answers:
字符串和VARCHAR。
不要尝试将电话号码存储为实际号码。它将破坏格式,删除前面0
的和其他不良内容。
如果您选择将用户输入限制为仅数字值,则即使在这种情况下,也应将保留的数据保留为字符/字符串而不是数字。
在尝试实施任何长度限制,验证或掩码(例如XXX-XXXX-XX)之前,请了解更广阔的世界以及它们的数字长度和格式有何不同。
非数字字符在电话号码中可以有效。一个典型的例子是在国际号码开头+
代替00
。
通过评论中的对话进行编辑:
-
。让用户随意设置格式。至少在早期开发中-数字格式在我的功能列表中不会很高。
VARCHAR
最适合但不是出于此答案中提到的原因的同意。问题是关于存储,而不是格式化。在存储之前,电话号码应转换为E.164。不存在可以0
以此格式开头的电话号码,因此,如果删除起始+
符号(可以从DB提取后添加),则可以将其存储为BIGINT
。唯一的缺点-那时很难通过部分输入的电话号码进行搜索。但是优点是-它占用更少的字节并且MySQL工作更快。
+
或者-
甚至是领先的0
时候可以有效地利用smallint
了dialcode
,并longint
用于number
从而最大限度地减少空间,提高了选择性能?
在MySQL中,> INT(10)并不表示10位数字,而是表示显示宽度为10位数字的整数。MySQL中INT的最大值为2147483647(如果未签名,则为4294967295)。
您可以使用BIGINT而不是INT来将其存储为数字。使用BIGINT将比VARCHAR(10)节省每行3个字节。
如果要存储“国家+地区+数字”。尝试使用VARCHAR(20)。这样,您可以在需要时正确存储国际电话号码。
串
一个简单的正则表达式。请参阅:如何在Java中检查字符串是否仅包含数字。使用javax.constraints.Pattern。
在mysql中:BIGINT。在Java中:长。