我需要存儲Medicare APC codes.我相信格式需要4個號碼數字數據類型。前導零是相關的。有沒有任何方法來存儲這種數據類型與驗證?我應該如何存儲這些數據(varchar(4),int)?SQL - 帶前導零
回答
varchar(4)
可選地,您仍然可以添加檢查約束來確保數據具有前導零的數字。這個例子會在Oracle中引發異常。在其他RDBMS,你可以使用正則表達式檢查:
alter table X add constraint C
check (cast(APC_CODE as int) = cast(APC_CODE as int))
這不是數字數據;它是恰好包含數字的文本數據。
使用VARCHAR
。
+1好技巧中,我將使用這些信息。 –
如果您需要前導零,那麼你必須使用一個varchar
或其他字符串數據類型。
有一些方法可以格式化爲前導零輸出,而不影響您的實際數據。
CHAR(4)
似乎更適合我(如果我理解你的權利,並且代碼始終是4個位數)。
你想使用的是具有CHECK約束VARCHAR數據類型,使用LIKE用一個模式來檢查數值。
如果您確信,APC代碼將永遠是數字(即如果它不會在不久的將來改變),更好的辦法是使數據庫列的值,並處理格式(以包括前導零)在您使用此字段值的地方。
我同意,使用
CHAR(4)
檢查約束使用
check(APC_ODE LIKE '[0-9][0-9][0-9][0-9]')
這將迫使只接受一個4位數字...
'LIKE'通常不接受正則表達式... –
Microsoft SQL確實支持上述操作,並且我相信大多數其他SQL方言都支持類似的東西... – Sparky
不錯,我不知道有關SQL Server ...通常,'LIKE'子句僅限於通配符:'%'和'_' –
這種問題,在某些場景(即排序)中存儲需要被視爲數字值的零前導數字以及作爲其他地方(即地址)中的文本值始終是一種痛苦,並且沒有一個答案對所有人都是最好的ERS。在我的公司,我們有一個數據庫,將數字存儲爲代碼文本(不是Medicare APC代碼),我們必須用零填充它們,以便在訂單操作中使用它們時可以正確排序。
,因爲該項目是不使用數字字符一個真實的數字,但文本數據,不要使用數字數據類型此。您不會對代碼執行任何計算或聚合,因此將它們存儲爲數字的唯一好處是確保對代碼進行正確排序,並且可以使用以文本形式存儲的代碼,並在需要時用零填充。如果你起訴一個數字數據類型,那麼無論何時代碼與其他文本值相結合,你都必須將它明確地轉換爲CHAR/VARCHAR或讓SQL Server執行它,因爲總是應該避免隱式轉換,這意味着需要大量的額外工作你和任何時候使用代碼的查詢處理器。
假設您決定使用文本數據類型,那麼問題是應該使用VARCHAR還是CHAR,而許多發佈了VARCHAR的用戶會建議您將CHAR設置爲4的長度。爲什麼?
VARCHAR數據類型用於預先未知大小(字符的長度或數量)的文本數據。對於這個醫療保險代碼,我們知道在可預見的將來,這個長度總是至少4,並且可能不超過4。 SQL Server在CHAR和VARCHAR之間處理數據的存儲方式不同。 SQL Server的BOL(圖書在線)說:
使用CHAR時當列數據的大小差異很大列數據項的大小一致
使用VARCHAR。
對於SQL Server 2008及以上版本,我不能說確實如此,但對於早期版本,VARCHAR數據類型的使用在表中具有每列每列數據1字節的額外開銷一個VARCHAR數據類型。如果存儲的數據總是相同的大小,並且在您的情況下聽起來像是這樣,那麼這個額外的字節是浪費。
最後,由您決定是更喜歡CHAR還是VARCHAR,但絕對不要使用數字數據類型來存儲固定長度的代碼。
- 1. TYPO3的RealURL:UID帶前導零
- 2. 帶前導零的int.Parse()
- 3. QTP - JavaTable - GetCellData - 帶前導零
- 4. SQL導入嚮導丟棄前導零
- 5. 帶前導零的int變量?
- 6. 帶前導零的數字,使用vb6
- 7. 比較帶前導零的字符串
- 8. 處理令牌帶前導零
- 9. JSON中帶前導零的字符串?
- 10. SQL Server 2005中 - 格式化帶前導零的十進制數
- 11. 沒有前導零SQL唯一索引
- 12. 帶或不帶格式化日期的前導零在PHP
- 13. 一個月的數字表示法,帶或不帶前導零
- 14. 前導零週期
- 15. 替換前導零
- 16. 如何有前導零
- 17. 帶有前導字符的SQL格式
- 18. PHP Excel導出丟棄前導零
- 19. 在SQL導出到TXT時保留前導零
- 20. 零位整數,除前導零之外
- 21. 保持前導零ç
- 22. printf與前導零在C
- 23. 前導零計數器
- 24. BigDecimal()省略前導零
- 25. Python - MYSQL - 選擇前導零
- 26. 保持前導零位
- 27. inet_addr函數和前導零
- 28. 如何創建前導零?
- 29. 瞭解前導零的str_pad()
- 30. 如何刪除前導零?
你的檢查約束怎麼會返回FALSE? – Sparky
@Sparky,好點。它不會返回錯誤。它引發了一個例外。至少在Oracle –
謝謝,這是有道理的。編程在捕獲異常和檢測數據庫約束錯誤之間會有點不同。我傾向於尋找約束錯誤,但是你的建議也是一個簡潔的方法.. – Sparky