【发布时间】:2011-08-24 02:47:37
【问题描述】:
我被要求使用一个数据库,其中大多数主键和其他字段也使用 char(n) 来存储带有填充的数值,例如:
product_id: char(8) [00005677]
user_id: char(6) [000043]
category_id: char(2) [05]
他们想要这样使用它的原因是,如果他们愿意,可以使用字符(在遥远的将来)。但是它们有很多基于数字的规则,例如 category_id 01 到 79 对应一般类别,80 到 89 是特殊类别,90 到 99 是用户自定义类别。
我个人认为使用 char(n) 存储数字是一种不好的做法。我的理由是:
- 使用字符," " != 0, 0 != 00, 05 != 5, 00043 != 000043 等等。是因为, 必须不断检查这些值(以防止数据损坏)。
- 如果我填充一个数字:0 -> 00,那么我要注意不要填充 一个字符(A -> 0A)
- 如果使用字符,则范围会变得奇怪,例如: 从 01 到 79 和 AB 和 RX 和 TZ 和 S 等等......
- 索引数字而不是字符可以提高性能
我建议使用 zerofill 将其更改为 decimal(n) 以使其更“防错”,因为此信息由不同来源(Web、Windows 客户端、上传 csv)修改。例如,如果他们想添加更多类别,那么从 decimal(2) 更新到 decimal(3) 会更容易。
那么我的问题是:我错了吗?可以信任 char(n) 来完成这项任务吗?如果“字符”对数字不利,那么我在上面的列表中还遗漏了哪些其他缺点(如果我想赢得我的案子,我可能需要更好的理由)?
TIA(任何评论/答案将不胜感激)。
【问题讨论】:
-
我会接受谁可以说服我以这种方式使用 char(n) 是完全安全的答案,或者谁可以给我更多为什么不使用 char 的理由。
-
@lepe:根据“最佳实践”,案件本身是荒谬的。前导零与存储无关,而仅与表示有关。只要您希望您的 id 以前导零显示 - 在您将其输出给用户之前 填充它们,并以您喜欢使用的任何格式存储。
-
+1。我完全同意你的看法......恕我直言,突然使用通常只使用数字的字符可能会在未来破坏事情。唯一的原因是他们想记住字符的数量,(这是:99,AA(2 个字符);100(3 个字符))。但我认为这不值得复杂化。如果有必要,增加数字会更容易......但是向他们解释! :S
-
char 在 ANSI SQL 中的所有比较有效地用空格填充在右侧。不确定MySQL是否存在问题。但是在您的情况下, varchar 或 char 没有区别,因为所有这些标识符的长度都应该等于列的容量,因为它们都应该在左边用“0”填充。您还没有提到将来是否所有代码都应该不包含空格并且是全长?
-
是的,我没有提到,因为现在还不清楚。到目前为止,只使用数字(我们谈论的是 ID)并且所有数字都必须是全长的(用零填充)。但是,如果他们也希望使用字符,我不确定是否允许使用空格……可能,这可能会使事情变得更加复杂。使用字符的唯一原因是拥有更多相同长度的 ID。这就是为什么我认为使用 char(n) 是一种无意义的限制。如果他们想添加更多 ID,那么只需增加数量,恕我直言。
标签: mysql char decimal zerofill