我被要求使用一個數據庫,其中大多數主鍵和其他字段也使用char(n)來存儲帶有填充的數值,例如:MySQL:使用char(n)與使用零填充的十進制(n)
product_id: char(8) [00005677]
user_id: char(6) [000043]
category_id: char(2) [05]
他們想用它這樣的原因,是爲了能夠使用的字符(在遙遠的未來),如果他們想要的。然而,他們有許多基於數字的規則,例如,從01到79的category_id對應於一般類別,並且從80到89是特殊類別,而90到99是用戶定義的類別。
我個人認爲使用char(n)來存儲數字是一種不好的做法。我的理由是:
- 使用char,「」!= 0,0!= 00,05!= 5,00043!= 000043等等。因此, 的值必須經常檢查(以防止數據損壞)。
- 如果我墊了一些:0 - > 00,那麼我要注意不要墊 字符(A - > 0A)
- 如果使用的字符,然後範圍變得怪怪的,是這樣的: 從01〜79和AB和RX和TZ和S,等...
- 索引號代替字符導致性能增益
我提議將其改爲十進制(N)與ZEROFILL到使其更加「防錯」,因爲這些信息被不同的來源(網絡,Windows客戶端,上傳CSV)修改。例如,如果他們想要添加更多類別,那麼從小數點(2)更新爲小數點(3)會更容易。
我的問題是:我錯了嗎? char(n)可以被這個任務信任嗎?如果「字符」是邪惡的數字,那麼我在上面的列表中缺少哪些其他缺點(如果我想贏得我的情況,我可能需要更好的理由)?
TIA(任何評論/答案將不勝感激)。
我會接受誰能說服我的答案,使用char(n)這種方式是完全安全的,或者可以給我更多理由說明爲什麼不使用char。 – lepe
@lepe:基於「最佳實踐」,案件本身是荒謬的。領先的零與存儲無關,但只與演示有關。只要您希望您的ID以前導零顯示 - 請在**之前將它們**輸出給用戶,並以您喜歡的任何格式進行存儲。 – zerkms
+1。我完全同意你...恕我直言,突然使用chars通常只有數字被使用可能會打破未來的事情。唯一的原因是他們想記住字符的數量(這是:99,AA(2個字符); 100(3個字符))。但我認爲這不值得複雜化。如果有必要的話,增加數字只是更容易......但向他們解釋! :S – lepe