在SQL Server 2005中应该使用什么数据类型来存储电话号码?

时间:2008-09-16 17:57:31

标签: sql-server indexing

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

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

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

欢迎提出任何建议。

更新:我无法控制源数据。只是xml文件的结构是标准的。想要将xml解析保持在最低限度。 一旦它在数据库中,检索应该很快。这里有一个疯狂的建议是它甚至应该使用Ajax AutoComplete功能(因此Sales Reps可以立即看到匹配的功能)。 OMG !!

15 个答案:

答案 0 :(得分:50)

这包括:

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

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

更新:为了解决AJAX问题,它可能没有您想象的那么糟糕。如果这是实际上对表进行任何操作的主要方式,那么只按照我的说法在辅助列中存储数字,然后使该列的索引成为聚类。

答案 1 :(得分:33)

我们使用varchar(15)并且肯定会对该字段进行索引。

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

Wikipedia - Telephone Number Formats

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

答案 2 :(得分:4)

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

答案 3 :(得分:3)

我可能错过了这里显而易见的问题,但是对于你最长的预期电话号码工作得不好而且varchar还不够长吗?

如果我错过了一些明显的东西,我会喜欢它,如果有人会指出它...

答案 4 :(得分:3)

我会使用varchar(22)。足够大,可以持有北美电话号码和扩展名。你可能想要删除所有讨厌的'(',')',' - '字符,或者只是将它们全部解析为一种统一的格式。

亚历

答案 5 :(得分:2)

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

答案 6 :(得分:2)

使用varchar是非常低效的。使用货币类型并创建一个用户声明的类型“phonenumber”,并创建一个规则,只允许正数。

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

答案 7 :(得分:1)

nvarchar使用预处理来尽可能地标准化它们。您可能希望提取扩展并将其存储在另一个字段中。

答案 8 :(得分:1)

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

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

答案 9 :(得分:1)

使用长度限制的varchar字段。

答案 10 :(得分:1)

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

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

答案 11 :(得分:1)

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

答案 12 :(得分:1)

使用“x”或“ext”指示扩展名是相当常见的,因此允许15个字符(完全国际支持)加3个(用于“ext”)加4个(用于扩展本身)总计22个字符。这应该会让你安全。

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

答案 13 :(得分:1)

我意识到这个线程已经过时了,但是值得一提的是存储作为数字类型用于格式化的优点,特别是在.NET框架中。

IE

.DefaultCellStyle.Format = "(###)###-####" // Will not work on a string

答案 14 :(得分:0)

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