0

我被要求使用一个数据库,其中大多数主键和其他字段也使用 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) 存储数字是一种不好的做法。我的理由是:

  1. 使用 char, " " != 0, 0 != 00, 05 != 5, 00043 != 000043 等等。因此,必须不断检查这些值(以防止数据损坏)。
  2. 如果我填充一个数字:0 -> 00,那么我要注意不要填充一个字符(A -> 0A)
  3. 如果使用了字符,那么范围就会变得奇怪,例如:从 01 到 79 以及 AB 和 RX 以及 TZ 和 S 等等......
  4. 索引数字而不是字符会导致性能提升

我建议使用 zerofill 将其更改为 decimal(n) 以使其更加“防错”,因为此信息由不同来源(Web、Windows 客户端、上传 csv)修改。例如,如果他们想添加更多类别,那么从十进制(2)更新到十进制(3)会更容易。

那么我的问题是:我错了吗?可以信任 char(n) 来完成这项任务吗?如果“字符”对数字不利,那么我在上面的列表中还缺少哪些其他缺点(如果我想赢得我的案子,我可能需要更好的理由)?

TIA(任何评论/答案将不胜感激)。

4

2 回答 2

1

引用你的问题:

...使用填充存储数值...

您没有显示任何数字数据示例,仅显示恰好由数字组成的字符数据。如果您说他们的OrderTotal专栏是 char(10),那么我会开始担心。

只需将其视为字符数据即可。我看不到更改数据库的业务或技术案例(除非您开始几乎完全重写)。

关于性能......如果这确实是一个问题,那么您很可能有更大的问题需要处理。MySQL 快速而准确。

--

为了查询的目的,在某处编写一个函数,将用户输入的 ID 填零。在需要接受用户输入的任何地方使用此功能。永远不要使用数字数据类型来存储您的数据(如果是 PHP,永远不要使用+,总是使用.concat 等...)

请记住,这与您可能遇到的任何其他字符串 ID没有什么不同。Item_Number = "SHIRT123"

小心

于 2011-08-24T03:02:42.743 回答
1

如果这是 SQL Server 或 Oracle 或任何其他 RDBMS,我建议对这些列执行检查约束,以便数据始终与列的全部容量匹配 - 这将确保您的标识符是统一的。

不幸的是MySQL 不支持这个

虽然它不会阻止必须在客户端或数据库中的 procs 中填充进入数据库或搜索例程中的内容的烦恼,但它可以保证您的字段在最低级别是干净的。

我发现使用这样的约束有助于避免事情严重失控。

至于使用数字的优化,如果它们将来必须容纳非数字字符,那将不是一个选择。

使用 varchar/char 数据拥有自然键(可能是主键的候选者)是很常见的,但是却强制代理键(通常是某种自动编号整数,它只是一个内部引用,通常是聚集索引和主键)。

于 2011-08-24T03:12:51.020 回答