【问题标题】:Which is best data type for phone number in MySQL and what should Java type mapping for it be?MySQL 中电话号码的最佳数据类型是什么,Java 类型映射应该是什么?
【发布时间】:2014-08-12 18:37:56
【问题描述】:

我正在为我的 Web 应用程序使用带有 Spring JDBC 模板的 MySQL。我需要存储只有数字(10)的电话号码。我对使用数据类型的数据类型有点困惑。

  1. 在 MySQL 中哪种数据类型更适合它?
  2. 为此,Bean (POJO) 类中的 Java 数据类型应该是什么?
  3. 如何使用 javax 验证/限制长度以及仅允许数字来验证该数据类型?

【问题讨论】:

    标签: java mysql phone-number digit


    【解决方案1】:

    字符串和 VARCHAR。

    • 不要尝试将电话号码存储为实际号码。它会破坏格式,删除前面的0s 和其他不受欢迎的东西。

    • 如果您愿意,您可以将用户输入限制为仅限数值,但即使在这种情况下,您也可以将支持的持久数据保留为字符/字符串而不是数字。

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

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

    编辑自 cmets 中的对话:

    • 电话号码与数字有任何关系是 UI 的较大错误之一。将它们视为地址要好得多,它比电话“号码”更接近它们的实际含义和代表。

    【讨论】:

    • 如果有人会阅读此内容,您可能也不想限制字符。不同的国家有不同的惯例,在 C 国读过一个数字很有可能会识别出 C 国的人在输入时使用的惯例。
    • 我个人会将其限制为 [0-9]、空格或连字符 -。让用户随意格式化。至少在早期开发中 - 数字格式在我的功能列表中不会很高。
    • 你们国家使用区号吗?人们会想从国外弄一个号码吗?这些以零 (0) 开头,如果您尝试保存数字而不是文本,则会丢失。电话号码与数字有任何关系是更大的 UI 错误之一。像地址一样思考和践踏它们要好得多,它更接近它们的实际含义和代表。
    • A 同意 VARCHAR 最合适,但不是出于此答案中提到的原因。问题是关于 storage 而不是格式化。电话号码在存储前应转换为E.164。不存在可以以这种格式以0 开头的电话号码,因此如果您删除以+ 开头的符号(您可以在从数据库获取后添加),那么您可以将其存储为BIGINT。唯一的缺点 - 很难通过部分输入的电话号码进行搜索。但它的优势 - 它占用更少的字节并且 MySQL 工作得更快。
    • “这是更大的 UI 错误之一”当您可以将数据存储为数字(拨号代码、数字)并在客户端?当您可以有效地将smallint 用于dialcodelongint 用于number 从而最小化空间并提高选择性能时,为什么还要存储不必要的字符+- 甚至是前导0
    【解决方案2】:
    1. varchar
    2. 字符串

    3. 一个简单的正则表达式。请参阅:How to check if a string contains only digits in Java。使用 javax.constraints.Pattern。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        你可以使用var-char、String和int,这取决于你,如果你只使用带有手机号码的国家代码而不是你可以使用int,如果你对数字使用特殊的格式而不是使用String或var-char类型, 如果你使用 var-char 则必须破坏数字的大小并限制用户。

        【讨论】:

          【解决方案5】:

          考虑使用E.164 格式。要获得全面的国际支持,您需要一个 15 位数字的 VARCHAR。

          有关电话号码本地化的更多信息,请参阅Twilio's recommendation

          【讨论】:

          • E.123有什么区别?
          • @nowox 您可以随时在线搜索以查看是否有在线答案。
          【解决方案6】:

          在 MySQL 中 -> INT(10) 不表示 10 位数字,它表示显示宽度为 10 位的整数。 MySQL 中 INT 的最大值为 2147483647(如果无符号,则为 4294967295)。

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

          如果要分别存储“国家+地区+号码”。尝试使用 VARCHAR(20)。这使您能够在需要时正确存储国际电话号码。

          【讨论】:

            【解决方案7】:

            在 mysql 中:BIGINT。 在 java 中:长。

            【讨论】:

              【解决方案8】:

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

              Java 端:

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

              它成功了!

              【讨论】:

                【解决方案9】:

                这一切都基于您的要求。如果您正在开发小型应用程序并且仅覆盖特定区域(目标受众),您可以选择 BIGINT 仅存储数字,因为 VARCHAR 比 BIGINT 消耗更多字节(具有最佳内存使用设计很重要)。但是如果你正在开发一个大型应用程序并针对全球用户,并且你有足够的数据库能力来存储数据,那么你绝对可以选择 VARCHAR。

                【讨论】:

                  【解决方案10】:
                  1. 字符串
                  2. varchar

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

                  【讨论】:

                    猜你喜欢
                    • 2017-03-20
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2014-10-24
                    • 2022-01-18
                    相关资源
                    最近更新 更多