所以这将是今年的虚拟问题,但我需要问一下,因为这不是我第一次遇到这个问题。看一下下表定义:
看看现在的列from_number
,VARCHAR(45)
但它将包含一个电话号码。由于我不知道一部手机可以在全世界拥有多少个号码,所以我试图覆盖几乎所有的号码。我想尽可能地保持数据库的完整性,所以我认为VARCHAR
不是保存此类信息的合适类型 - 你告诉我,也许我错了 - 所以我正在考虑更改INT
为BIGINT
.
当我在 Workbench 中定义一个列时,我应该指定括号之间的数字,()
而不是在所有情况下,但在我之前提到的那些情况下,我必须这样做。所以如果我这样做:BIGINT()
我得到这个错误:
指导我在这里阅读一些关于这种 MySQL 类型的信息。基本上信息是这样的:
一个大整数。... 无符号范围是 0 到 18446744073709551615。
这让我问:当我定义一个BIGINT()
类型时,我应该为括号设置什么值。(我使用 BIGINT 是因为我不知道 INT 是否可以容纳与电话一样多的数字——也许我也错了)。在 MariaDB/MySQL 数据库中创建|设计列的正确方法是什么?
无论如何,我想知道您的意见,经验,当然我想得到答案
注意:我正在使用 MySQL Workbench 最新版本来创建 ER 图。我也在使用 MariaDB 10.0.x
您将如何处理带有分机的电话号码,例如“+1-000-000-0000 ext 1234”?
注意,“+”表示应使用国际拨号规则;所以来自北美,系统在国际电话前自动知道“011”等。
另外,诸如“1-800-DBA-HELP”之类的电话号码呢?
我通常会将电话号码存储为文本。话虽如此,这实际上取决于您的电话号码列的重要性。如果您正在从该列运行自动拨号程序,那么您确实希望确保仅包含数字,并且数据代表格式正确的电话号码。
您可以为分机和带有文本的电话号码设置单独的列,例如我提供的“1-800-DBA-HELP”示例。
之前是这样写的:
“使用 MariaDB,您可以使用
computed
字段来提取自动拨号器的数字。也适用于 MySQL 5.7。”针对 OP 对此的问题(“你能解释一下你在告诉我什么?”),这里有一个解释。
现在很多数据库系统都引入了这个特性。这些字段被称为“
computed
”、“virtual
”或“generated
”,它们是从其他字段中的值派生而来的。此功能的强大功能取决于您的 RDBMS。我知道 Oracle、Firebird、MariaDB 和现在的 MySQL 5.7 都有它们。其他人可能也会这样做。一个简单的例子是有一个姓氏列并有一个计算列“存储”(记住,它们可以是虚拟的 - 即即时计算,或者它们可以物理存储在磁盘上)姓氏作为所有大写字母,从而使搜索更容易。这样你只需要在
CAP
s 上搜索(使用,比如说,LIKE
),知道在 [computed
|中搜索的数据。virtual
|generated
] 字段为大写文本。此处和此处解释了 MySQL 5.7 的概念。它在 MariaDB 中已经存在一段时间了,这里也解释了这个概念。这里建议了一些可能的用途,但你真的只受到你的想象力的限制。它们可以被视为触发器的方便(且不易出错)替代品。
对于您的特定用例,您可以从文本字段“+”->“00”(或任何您的国际拨号代码)中派生一个可拨打的号码。只是一个想法。
唔。电话号码是由数字组成的。使用 varchar 允许用户存储任何类型的格式,使用 ( 或不使用 - 或 . 并且它很快就会使您的数据变得混乱。电话 # 格式取决于“国家”,掩码应该与国家相关联。扩展名是一个扩展并且是可选的,所以它应该存储在一个“扩展字段”中。(int也是)。对于1-800-DBA-HELP,我会即时转换它并存储实际数字。如果你真的需要这些人类可读的电话号码,将其存储在单独的 varchar 字段中。
我通常将电话号码存储在简单的文本中。格式化和显示留给客户端代码。
在这里,不止,你如何存储?你打算用那个电话号码做什么真的很重要。
如果您的企业想要从您的系统执行出站呼叫,应用程序将只提取号码。如果您的企业想要拨打国际电话,请将国家代码和区号存储在单独的列中。
如果您的企业需要报告,应用程序将分别格式化和显示扩展名和数字。
据我了解,为电话号码设计通用数据模型并不是一个好主意。除国家代码外,每个国家/地区都有不同的号码、分机号和区号。另外,我才知道,有些国家没有区号。
这可能无法回答您的问题,但有助于扩大我们的理解。谢谢你。