2008-09-16 99 views
55

我需要將電話號碼存儲在表格中。請建議我應該使用哪種數據類型? 等待。請在回覆之前閱讀。什麼數據類型應該用於在SQL Server 2005中存儲電話號碼?

由於銷售代表可以使用此字段進行搜索(包括通配字符搜索),因此需要對此字段進行大量索引。

截至目前,我們期待電話號碼以多種格式(來自XML文件)。我是否必須編寫解析器才能轉換爲統一格式?有可能是數以百萬計的數據(有重複),我不想佔用服務器資源(在活動,如預處理太多)每部分的源數據來自通過時間..

任何建議,歡迎..

更新:我無法控制源數據。只是xml文件的結構是標準的。希望保持XML解析到最低限度。 一旦它在數據庫中,檢索應該很快。一個瘋狂的建議是,它甚至可以使用Ajax自動完成功能(因此銷售代表可以立即看到匹配的)。我的天啊!!

+0

您可能想要使用https://github.com/googlei18n/libphonenumber來解析/清除源數據。 – 2018-01-31 17:55:08

回答

42

這是否包括:

  • 國際號碼?
  • 擴展?
  • 除了實際數量之外的其他信息(如「請求bobby」)?

如果所有這些都是否定的,我會使用10個字符字段並去除所有非數字數據。如果第一個是肯定的,另外兩個是否定的,我會使用兩個varchar(50)字段,一個用於原始輸入,另一個用於所有非數字數據條帶化並用於索引。如果2或3是肯定的,我想我會做兩個字段和一些瘋狂的解析器,以確定什麼是擴展或其他數據,並適當地處理它。當然,你可以通過做一些索引來避開第二列,在創建索引時它會去除額外的字符,但是我只是做第二列,並且可能用觸發器去除字符。

更新:解決AJAX的問題,它可能不會像你想象的那樣糟糕。如果這實際上是對錶格執行任何操作的主要方式,那麼就像我剛纔所說的那樣僅將輔助列中的數字存儲起來,然後使該列的索引成爲一個集羣。

+0

是的所有問題。我無法控制源數據。那裏有一些好的建議。謝謝。 – John 2008-09-16 18:07:31

+8

我認爲這是一個挑剔的問題,但10個字符字段不會涵蓋大部分英國手機號碼和許多英國陸線號碼。即使在美國,也會允許超過10個電話號碼的未來擴展。 – 2011-08-15 11:22:33

+1

爲什麼不用`decimal(10,0)`而不是`char`? – 2016-08-26 20:15:19

1

nvarchar預處理,以儘可能標準化它們。您可能需要提取擴展名並將它們存儲在另一個字段中。

1

規範化數據然後存儲爲varchar。規範化可能會很棘手。

這應該是一次性打擊。然後,隨着新記錄的進入,您將其與歸一化數據進行比較。應該非常快。

2

我可能在這裏很明顯缺少明顯的,但不會足夠長的varchar足夠長的預期電話號碼的最長時間工作?

如果我上午缺少明顯的東西,我很喜歡它,如果有人會指出來......

+0

+1我期待這個答案.. – 2014-09-22 05:19:11

1

使用varchar字段長度限制。

3

我會使用varchar(22)。大到足以容納帶有分機號碼的北美電話號碼。你會想刪除所有令人討厭的'(',')',' - '字符,或者只是將它們全部解析爲一個統一的格式。

亞歷

3

使用CHAR(10)如果你存儲僅適用於美國的電話號碼。刪除除數字之外的所有內容

+3

並沒有擴展 – 2013-02-19 00:45:36

2

SQL Server 2005針對索引varchar字段中的文本的子字符串查詢進行了很好的優化。在2005年,他們爲索引字段的字符串摘要引入了新的統計數據。這有助於全文搜索。

27

我們使用varchar(15)並肯定索引該字段。

的原因是,國際標準,可支持多達15位

Wikipedia - Telephone Number Formats

如果支持國際電話號碼,我推薦一個世界區域或國家代碼的獨立存儲,以便更好地過濾查詢通過這樣你就不會發現自己的解析和檢查你的電話號碼字段,因爲你需要適應許多不同的電話號碼格式(也可能包括諸如擴展等限制,例如

1

返回調用USA的長度)它可能會最好的辦法就是像對待任何其他varchar一樣對待它。如果你可以控制輸入,你可以採取一些方法來使數據更有用,但它聽起來並不是那樣。

一旦你決定簡單地把它當作任何其他字符串,你可以專注於解決有關壞數據,神祕的電話號碼格式化和其他任何會彈出不可避免的問題。我們面臨的挑戰將是如何爲數據構建一個好的搜索策略,而不是以我的觀點存儲它。處理大量無法控制收集的數據總是一項艱鉅的任務。

1

使用SSIS來提取和處理信息。這樣你就可以處理從SQL Server中分離出來的XML文件。如果需要,您也可以在單獨的服務器上執行SSIS轉換。使用VARCHAR將電話號碼存儲爲標準格式。 NVARCHAR是不必要的,因爲我們正在討論數字,也許還有其他幾個字符,比如'+','','(',')'和' - '。

2

使用varchar相當低效。使用金錢類型,並創建一個用戶聲明類型「phonenumber」,並創建一個規則,只允許正數。

如果你聲明爲(19,4),你甚至可以存儲一個4位數字的擴展,併爲國際數字足夠大,並且只需要9個字節的存儲空間。另外,索引也很快。

1

這是相當常見的用「X」或「外部」來表示的擴展,所以允許15個字符(全國際支持)加3(爲「分機」)加4(用於擴展本身)給予共22個字符。這應該讓你安全。

可替換地,歸一化的輸入,所以任何「EXT」被轉換爲「X」,給出最大20。

1

我意識到這個線程是舊的,但值得一提的是存儲爲一個數字類型的格式化,特別是在.NET框架中的優勢。

IE

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

它始終是最好有像電話號碼的多值的屬性不同的表。

由於您無法控制源數據,所以您可以解析XML文件中的數據並將其轉換爲適當的格式,以便不會對特定國家/地區的格式有任何問題並將其存儲在單獨的表,以便索引和檢索兩者都將是高效的

謝謝。

相關問題