我被要求使用一个数据库,其中大多数主键和其他字段也使用 char(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 等等......
- 索引数字而不是字符会导致性能提升
我建议使用 zerofill 将其更改为 decimal(n) 以使其更加“防错”,因为此信息由不同来源(Web、Windows 客户端、上传 csv)修改。例如,如果他们想添加更多类别,那么从十进制(2)更新到十进制(3)会更容易。
那么我的问题是:我错了吗?可以信任 char(n) 来完成这项任务吗?如果“字符”对数字不利,那么我在上面的列表中还缺少哪些其他缺点(如果我想赢得我的案子,我可能需要更好的理由)?
TIA(任何评论/答案将不胜感激)。