我被要求使用一个数据库,其中大多数主键和其他字段也使用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