2013-05-06 110 views
1

通常情況下,INTEGER數據類型就足夠了,但在南非,ID號碼的長度爲13,而INTEGER數據類型只能達到10.我不喜歡使用VARCHAR這樣的字符,因爲它不會限制僅將ID號輸入到整數值。我只看到解決方案(其他使用VARCHAR)是使用DECIMAL。只有我看到的問題是,我無法像VARCHAR那樣限制最大大小,並且數據輸入可能包含','和'。'。任何意見?在SQL Server 2008中,我可以使用哪種數據類型作爲長度爲13位的ID號碼?

+0

他們的*固定長度是13還是僅13 *最大長度? – 2013-05-06 17:33:53

回答

4

只要使用BIGINT,範圍從-9223372036854775808到9223372036854775807,這對您的應用程序來說應該足夠了。

3

我確實使用VARCHARCHECK匹配的格式。如果有內部驗證,您甚至可以更加複雜,例如一個校驗碼。現在你已經爲具有字母字符的其他國家或者如果你需要處理前導零。

我不會使用整數,除非在字段上做某種算術是有意義的,這在這裏幾乎肯定是不正確的。

+0

**從不**,將數字存儲在varchar列中。甚至沒有控制格式的檢查約束。 – 2013-05-06 17:18:32

+0

@a_horse_with_no_name,你願意提供一個理由嗎?除了幾個字節之外,你在這裏使用數字是什麼?該ID不是真正的「數字」,您不會添加或平均它,它是一個只有數字的字符串。它很可能需要驗證。 – 2013-05-06 17:24:55

+1

在字符列中存儲數字時,很多事情可能會出錯。想到排序(10會在2之前排序),你不能可靠地使用'<' or '>'(甚至是'=' - 想想'001'與'1')來比較它們。你會發現自己來回傳遞字符值。無需檢查限制,無論如何,這將成爲絕對的噩夢。*如果*這是一個「代碼」而不是一個數字ID,那麼使用varchar可能有意義,但我們不知道我在那裏同意你的意見。 – 2013-05-06 17:28:23

0

您也可以使用money,儘管看起來您只能在小數點後4位數字。 money類型爲8個字節,範圍從-922,337,203,685,477.5808到922,337,203,685,477.5807。

declare @num as money 
select @num = '1,300,000.45' 

select @num 

結果:

1300000.45 

逗號和句號的分析可能是依賴於特定的文化設置,但我不知道那是肯定的。

4

假設你指的是南非的身份證號碼,其中according to Wikipedia總是有13位數字,那麼我會去CHAR(13)CHECK約束(一個CLR user-defined data type也可能是一個選項)。

主要原因是'數字'不是一個數字,而是一個ID。您不能對數值進行加,減,乘等操作,因此使用數字數據類型沒有任何好處。此外,ID由具有其自身含義的組件組成,因此能夠解析它們可能很重要(並且在使用字符數據類型時更容易)。實際上,根據您使用這些數據的方式,您還可以添加存儲ID(DOB,序列,公民身份)各個組成部分的列,可以是計算列或實際列。這對於查詢和報告(以及索引)非常方便,特別是如果您將DOB轉換爲datedatetime列。

+2

是的,你有三種方式去與這樣的ID。 1)假設你得到的每個身份證都是好的。 2)假設你得到的每個id可能不好,並驗證校驗和。 3)假設你得到的每個ID可能不好,並驗證組成部分。如果我有我的選擇,我從不認爲每個ID都是好的。我至少會驗證校驗和。 – 2013-05-06 20:05:10

相關問題