92

我需要将电话号码存储在表格中。请建议我应该使用哪种数据类型? 等待。请在点击回复之前阅读..

此字段需要大量索引,因为销售代表可以使用此字段进行搜索(包括通配符搜索)。

截至目前,我们预计电话号码将采用多种格式(来自 XML 文件)。我是否必须编写解析器才能转换为统一格式?可能有数百万个数据(有重复),我不想每次通过一些源数据时都占用服务器资源(在预处理等活动中)。

欢迎任何建议..

更新:我无法控制源数据。只是xml文件的结构是标准的。希望将 xml 解析保持在最低限度。一旦它在数据库中,检索应该很快。这里出现的一个疯狂建议是,它甚至应该与 Ajax 自动完成功能一起使用(这样销售代表可以立即看到匹配的)。我的天啊!!

4

16 回答 16

65

这是否包括:

  • 国际号码?
  • 扩展?
  • 除了实际号码之外的其他信息(如“询问鲍比”)?

如果所有这些都不是,我将使用 10 字符字段并删除所有非数字数据。如果第一个是“是”而另外两个不是,我将使用两个 varchar(50) 字段,一个用于原始输入,一个将所有非数字数据条带化并用于索引。如果 2 或 3 是肯定的,我想我会做两个字段和某种疯狂的解析器来确定什么是扩展或其他数据并适当地处理它。当然,您可以通过对索引执行某些操作来避免第二列,在创建索引时它会去除多余的字符,但我只会创建第二列,并且可能会使用触发器来去除字符。

更新:为了解决 AJAX 问题,它可能没有你想象的那么糟糕。如果这实际上是对表执行任何操作的主要方式,则如我所说,仅将数字存储在辅助列中,然后将该列的索引设为聚集索引。

于 2008-09-16T18:02:48.187 回答
47

我们使用 varchar(15) 并在该字段上建立索引。

原因是国际标准最多可以支持 15 位数字

维基百科 - 电话号码格式

如果您确实支持国际号码,我建议单独存储世界区代码或国家代码,以便更好地过滤查询,这样您就不会发现自己解析和检查电话号码字段的长度来限制返回到美国的电话例子

于 2008-09-16T18:03:29.683 回答
5

如果您只存储美国电话号码,请使用 CHAR(10)。删除除数字以外的所有内容。

于 2008-09-16T18:00:49.503 回答
3

我可能在这里遗漏了明显的东西,但是对于您最长的预期电话号码来说,varchar 的长度是否不够好?

如果我遗漏了一些明显的东西,如果有人能指出它,我会很高兴......

于 2008-09-16T18:00:02.420 回答
3

我会使用 varchar(22)。大到足以容纳一个带分机的北美电话号码。你会想要去掉所有讨厌的 '(', ')', '-' 字符,或者只是将它们全部解析成一种统一的格式。

亚历克斯

于 2008-09-16T18:00:33.170 回答
2

带有预处理的 nvarchar 以尽可能地标准化它们。您可能想要提取扩展并将它们存储在另一个字段中。

于 2008-09-16T17:59:02.970 回答
2

SQL Server 2005 针对索引 varchar 字段中的文本的子字符串查询进行了很好的优化。2005 年,他们为索引字段的字符串摘要引入了新的统计数据。这对全文搜索有很大帮助。

于 2008-09-16T18:02:01.543 回答
2

使用 varchar 效率很低。使用货币类型并从中创建一个用户声明的类型“电话号码”,并创建一个只允许正数的规则。

如果您将其声明为 (19,4),您甚至可以存储一个 4 位数的扩展名,并且对于国际号码来说足够大,并且只需要 9 个字节的存储空间。此外,索引速度很快。

于 2011-05-03T16:12:23.670 回答
1

规范化数据,然后存储为 varchar。规范化可能很棘手。

这应该是一次性的。然后随着新记录的出现,您将其与标准化数据进行比较。应该非常快。

于 2008-09-16T17:59:44.480 回答
1

使用有varchar长度限制的字段。

于 2008-09-16T18:00:16.977 回答
1

由于您需要适应许多不同的电话号码格式(并且可能包括扩展等),因此将其视为任何其他 varchar 可能是最有意义的。如果您可以控制输入,则可以采取多种方法使数据更有用,但听起来并非如此。

一旦您决定将其简单地视为任何其他字符串,您就可以专注于克服有关不良数据、神秘电话号码格式以及其他任何会弹出的不可避免的问题。在我看来,挑战在于为数据建立一个好的搜索策略,而不是如何存储它。处理大量您无法控制收集的数据始终是一项艰巨的任务。

于 2008-09-16T18:05:57.180 回答
1

使用 SSIS 提取和处理信息。这样,您将处理与 SQL Server 分离的 XML 文件。如果需要,您还可以在单​​独的服务器上执行 SSIS 转换。使用 VARCHAR 以标准格式存储电话号码。NVARCHAR 是不必要的,因为我们谈论的是数字,也许还有其他几个字符,比如'+'、''、'('、')' 和'-'。

于 2008-09-16T18:09:01.510 回答
1

使用“x”或“ext”表示扩展名是相当普遍的,因此允许 15 个字符(用于完全国际支持)加上 3 个(用于“ext”)加上 4 个(用于扩展名本身),总共 22 个字符. 那应该保证你的安全。

或者,对输入进行规范化,以便将任何“ext”转换为“x”,最多为 20。

于 2013-07-22T09:34:23.890 回答
1

我意识到这个线程很旧,但值得一提的是存储为用于格式化目的的数字类型的优势,特别是在 .NET 框架中。

IE

.DefaultCellStyle.Format = "(###)###-####" // Will not work on a string
于 2017-03-23T01:14:18.883 回答
1

最好为电话号码等多值属性设置单独的表格。

由于您无法控制源数据,因此您可以解析 XML 文件中的数据并将其转换为适当的格式,这样特定国家/地区的格式就不会出现任何问题,并将其存储在单独的表中,以便索引和检索都将是有效的。

谢谢你。

于 2017-08-12T14:36:15.013 回答
0

请改用 long 数据类型。不要使用 int,因为它只允许介于 -32,768 和 32,767 之间的整数,但如果使用 long 数据类型,则可以插入介于 -2,147,483,648 和 2,147,483,647 之间的数字。

于 2020-04-02T20:31:58.887 回答