it-swarm.cn

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

我需要将电话号码存储在一张桌子里。请建议我应该使用哪种数据类型? 等等。请在回复之前阅读..

由于销售代表可以使用此字段进行搜索(包括野生字符搜索),因此需要对此字段进行大量索引。

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

欢迎任何建议..

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

68
John

这包括:

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

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

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

50
Kearns

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

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

维基百科 - 电话号码格式

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

33
Brad Osterloo

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

4
Joseph Bui

我可能在这里错过了显而易见的事情,但是你的最长预期电话号码工作得不好吗?

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

3
cori

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

亚历克斯

3
Alex Fort

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

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

2
fjleon

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

2
Joseph Daigle

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

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

1
Rob G

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

1
John Sheehan

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

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

1
Iain Holder

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

1
user13270

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

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

1
unicorn.ninja

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

1
Magnus Johansson

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

IE

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

为电话号码等多值属性设置单独的表总是更好。

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

谢谢。

0
Jayghosh Wankar