我需要将电话号码存储在表格中。 请建议我使用哪种数据类型? 等待。 请先阅读,然后再点击回复。

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

到目前为止,我们希望电话号码有多种格式(来自XML文件)。 我必须编写解析器以转换为统一格式吗? 可能会有数百万的数据(重复的数据),我不希望每次通过某些源数据时都占用服务器资源(在诸如预处理等活动中)。

任何建议都欢迎。

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

===============>>#1 票数:51 已采纳

这是否包括:

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

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

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

===============>>#2 票数:38

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

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

维基百科-电话号码格式

如果您确实支持国际号码,建议您单独存储一个世界区号或国家/地区代码,以更好地过滤查询,以免您自行解析和检查电话号码字段的长度以限制返回美国的电话例

===============>>#3 票数:4

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

===============>>#4 票数:3

我可能在这里没有发现明显的地方,但是varchar是否不能足够长以至于您期望的最长电话号码正常工作?

如果失去了一些东西很明显,我很喜欢它,如果有人会指出来...

===============>>#5 票数:3

我会使用varchar(22)。 足够大,可以容纳带有分机号的北美电话号码。 您可能希望去除所有讨厌的'(',')','-'字符,或仅将它们解析为一种统一格式。

亚历克斯

===============>>#6 票数:2

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

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

===============>>#7 票数:2

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

===============>>#8 票数:1

通常用“ x”或“ ext”来表示扩展名,因此允许使用15个字符(以获得完整的国际支持)加3个字符(“ ext”)加4个(扩展名本身),总共22个字符。 那应该使您安全。

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

===============>>#9 票数:1

我意识到该线程很旧,但是值得一提的是,出于格式化目的,特别是在.NET Framework中,将其存储为数字类型的好处。

IE浏览器

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

===============>>#10 票数:1

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

===============>>#11 票数:1

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

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

===============>>#12 票数:1

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

===============>>#13 票数:1

由于您需要容纳许多不同的电话号码格式(可能包括分机号等),因此像对待其他varchar一样对待它可能是最有意义的。 如果您可以控制输入,则可以采取多种方法来使数据更有用,但事实并非如此。

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

===============>>#14 票数:1

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

===============>>#15 票数:0

对于电话等多值属性,最好有单独的表。

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

谢谢。

  ask by John translate from so

未解决问题?本站智能推荐:

2回复

如何在SQL Server 2005中检索数据库中的所有索引及其数据类型?

我有一个维护任务失败了,因为数据库上有一些索引,这些索引的类型不允许在线重建索引。 离线不是我行业中的选择,因此我必须创建自己的T-SQL任务,以对特定索引进行索引重建。 数据库很大,有很多表和索引,因此有没有一种方法可以查询系统中所有索引及其数据类型?
2回复

如何在SQL Server 2005中存储日历应用程序数据

我正在创建一个在线日历应用程序(例如Google日历或MS Outlook), 但不确定如何存储数据以快速查询基本视图:每日,每周,每月。 在将其标记为重复之前,请记住,我已经在这里阅读了多个线程,并且在大多数情况下,它们说“对于通用而言,优化太难了”。 就我而言,这是一个非常具体的目的
4回复

在SQL Server 2005中的巨大表上使用“not in”进行更新

我有一个大约115k行的表。 像这样的东西: 最初,我有一个像这样定义的索引: 而且我正在做这样的更新: 这个庞大的列表基本上是表中99%的用户。 此更新永远在我的服务器上。 作为测试,我将“not in”子句中的特殊代码列表修剪为表中1%的用户,并且我的执行计
4回复

如果要索引的列是SQL Server中的nvarchar数据类型,该怎么办?

我通过连接多个表来检索数据,如下图所示。 另一方面,由于事件表的FK列(EmployeeID)中没有数据,因此我必须使用CardNo(nvarchar)字段才能连接两个表。 另一方面,Event和Employee表中CardNo字段的位数不同,我还必须使用SQL Server的RIGHT函数
1回复

区分SQL Server XML数据类型?

我有一个自动过程,该过程将XML文档插入SQL Server 2008表中,该列的类型为XML。 有很多重复的数据,我想知道是否有人可以推荐一种基于XML列删除非不同值的好方法? 该表有数千行,每个XML文档约为70k。 除了一个元素值,每个XML文档看起来都相同,例如: 第1行
1回复

SQL Server索引中实际使用哪种类型的B树?

关于SQL Server甚至BOL的许多书籍都提到SQL Server使用B树来存储索引。 最近,我从有关索引的讲座中了解到,实际上已使用了B +树 。 现在我完全感到困惑。 我欣赏B +树是B树的子集的事实。 但这就像在说“人类的婴儿是人类所生”,这并非事实。 事实是“人类的
1回复

SQL Server - 列数据类型和曲面细分方案不匹配

我正在尝试在数据库中的“ Location列上创建索引。 收到此错误: Mismatch in column datatype and tessellation scheme 它是纬度和经度字段的简单地理计算字段。 我在这做错了什么? 在我的应用程序中,我对此Locat
2回复

如何:在SQL Server 2005中管理多个重叠索引

为了举例,我有一个表ABCDEFG H的表。 我在表上创建了两个与最常用查询对应的索引。 第一个是BCD和E列。第二个是BCDE和F. 使用这些列的查询被称为相同的次数,并且每个查询都针对索引进行了优化。 我的问题是 - 由于我在这个表上有多个索引,行大小非常​​大。 我想
5回复

SQL Server 2005中没有聚簇索引的原因

我为SQL SERVER 2005数据库继承了一些数据库创建脚本。 我注意到的一件事是,所有主键都是作为NON CLUSTERED索引而不是群集创建的。 我知道每个表只能有一个聚簇索引,并且您可能希望将它放在非主键列上以查询搜索性能等。但是问题中的表中没有其他CLUSTERED索引。
1回复

在SQL Server Express 2005中自动重建索引

我的团队正在开发一个.NET Web应用程序,该应用程序的数据存储通过SQL Server 2005 Express管理。 是否可以自动化数据库中的任务,以使其在部署/安装后的间隔内自动重建某些索引? 如果是这样,这是如何实现的? 我以为它将在数据库的tasks下,但我看不到它。