电话号码的数据类型:VARCHAR,INT或BIGINT?


12

因此,这将是今年的虚拟问题,但我要问的是,这不是我第一次通过此问题。看一下下表定义:

在此处输入图片说明

看一下当前的专栏from_numberVARCHAR(45)但其中包含电话号码。由于我不知道手机在世界范围内可能有多少个号码,因此我尝试涵盖几乎所有号码。我想尽可能地保持数据库的完整性,所以我认为VARCHAR这不是保存此类信息的合适类型-也许我错了,你告诉我-所以我在考虑更改INT甚至更改BIGINT

当我在Workbench中定义列时,我不应该()在所有情况下都指定括号之间的数字,而在我之前提到的情况下,则必须指定括号中的数字。因此,如果执行此操作:BIGINT()我收到此错误:

在此处输入图片说明

这使我在这里阅读了有关此MySQL类型的一些信息。基本上信息是这样的:

一个大整数。...无符号范围是0到18446744073709551615。

这让我问:定义BIGINT()类型时应为括号设置什么值。(我正在使用BIGINT,因为我不知道INT是否可以容纳电话所能容纳的尽可能多的数字-也许我也是错的)。在MariaDB / MySQL数据库中创建|设计列的正确方法是什么?

无论如何,我想知道您的意见,经验,当然我想得到一个答案

注意:我正在使用MySQL Workbench最新版本来创建ER图。我也在使用MariaDB 10.0.x


Answers:


13

您将如何处理带有扩展名的电话号码,例如“ + 1-000-000-0000 ext 1234”?

注意,“ +”表示应使用国际拨号规则;因此从北美开始,系统会在国际电话等之前自动知道“ 011”。

另外,诸如“ 1-800-DBA-HELP”之类的电话号码又如何呢?

我通常将电话号码存储为文本。话虽如此,这实际上取决于您的电话号码栏的重要性。如果您正在该列中运行自动拨号程序,那么您真的要确保仅包括数字,并且数据代表格式正确的电话号码。

您可能有单独的分机列和带有文本的电话号码,例如我提供的“ 1-800-DBA-HELP”示例。


是的,它们很关键,因此我将来不会犯任何错误,因为我只允许输入数字,您对此有何建议?很容易添加一个包含分机号的新列,或者我想让人们用数字来输入1-800-DBA-HELP数字
ReynierPM 2015年

这确实取决于您的要求。如果您需要保留人类可识别性,我当然希望将基于文本的数字保留在某个地方,可能在文本字段中。如果您不关心文本部分,则不要存储它们。
Max Vernon

1
如果用国家代码存储完整的数字,则INT肯定不够大。BIGINT可能足够大。
Max Vernon

1
我想要至少20位数字。
Max Vernon

1
使用MariaDB,您可以使用计算字段仅提取自动拨号的数字。也许在MySQL 5.7中(不确定)。
Vérace

2

以前是这样写的:

“使用MariaDB,您可以使用一个computed字段仅提取自动拨号的数字。也适用于MySQL 5.7。”

在回答OP关于此的问题(“您能解释一下您告诉我的内容吗?”)时,这里有一个解释。

现在,许多数据库系统都引入了此功能。这些是从其他字段中的值派生的字段,分别称为“ computed”,“ virtual”或“ generated”。此功能的功能将取决于您的RDBMS。我知道Oracle,Firebird,MariaDB和现在的MySQL 5.7都有它们。其他人也可能这样做。

一个简单的例子是拥有一个姓氏列,并具有一个计算列,该列将所有姓氏“存储”(记住,它们可以是虚拟的-即即时计算,或者可以物理存储在磁盘上),从而使搜索更容易。这样,您仅需搜索CAPs(使用,例如LIKE),就知道在[ computed|中搜索了数据。virtual| generated]字段为大写字母。

MySQL 5.7的概念在此处此处进行了解释。它在MariaDB中已经存在了一段时间,并且在也对概念进行了说明。这里提出一些可能的用法,但实际上您仅受想象力的限制。可以将它们视为触发器的便捷替代方法(并且不易出错)。

对于您的特定用例,您可以从文本字段“ +”->“ 00”(或任何国际拨号代码)中得出可拨打的号码。只是一个想法。


太好了,您可以通过添加一些查询来改善您的问题吗?我的意思是我有这个概念,但是我不确定如何创建virtualor generated值。我正在考虑使用CONCAT或其他方式,但不确定。另外你提到通过搜索CAPS使用LIKE,你可以把这样的例子吗?动态计算的列(virtual) vs persisted (生成的)的性能如何?
ReynierPM 2015年

1

嗯 电话号码由数字组成。使用varchar允许用户使用(或不使用-或。来存储任何类型的格式,并且很快就会使您的数据混乱。电话#格式是“国家/地区”相关的,掩码应与国家/地区绑定。是扩展名,并且是可选的,因此应将其存储在“扩展名字段”中(也应为int)。对于1-800-DBA-HELP,我会即时对其进行转换并存储实际号码。如果您确实需要这些可读电话#,将其存储在单独的varchar字段中。


1

我通常将电话号码存储为简单文本。格式化和显示将其留给客户端代码。

在这里,还有,您如何存储?该电话号码的用途非常重要。

如果您的企业要从系统执行呼出电话,则应用程序将仅提取号码。如果您的公司想拨打国际电话,请将国家代码和区号存储在单独的列中。

如果您的企业需要报告,则该应用程序将分别格式化和显示,并带有扩展名和数字。

据我了解,设计电话号码通用数据模型不是一个好主意。每个国家/地区都有国家/地区代码以外的号码,分机号和区号。另外,我知道某些国家/地区没有区号。

这可能不会回答您的问题,但将有助于扩大我们的理解。谢谢。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.