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

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

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

欢迎任何建议..

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

有帮助吗?

解决方案

这是否包括:

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

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

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

其他提示

我们使用 varchar(15) 并且当然在该字段上使用索引。

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

维基百科 - 电话号码格式

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

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

我可能在这里遗漏了明显的内容,但是 varchar 的长度足以满足您最长的预期电话号码吗?

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

我会使用 varchar(22)。足够大,可容纳带分机号的北美电话号码。您可能想要删除所有讨厌的“(”、“)”、“-”字符,或者只是将它们全部解析为一种统一的格式。

亚历克斯

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

使用 varchar 效率相当低。使用货币类型并创建一个用户声明类型“phonenumber”,并创建一条规则仅允许正数。

如果您将其声明为 (19,4),您甚至可以存储 4 位数字的扩展名,并且足够大以容纳国际号码,并且仅占用 9 个字节的存储空间。此外,索引速度很快。

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

标准化数据然后存储为 varchar。标准化可能很棘手。

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

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

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

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

用一个 varchar 具有长度限制的字段。

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

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

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

IE

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

对于电话号码等多值属性,最好使用单独的表。

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

谢谢。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top