我应该使用哪种数据类型来处理九位帐号,为什么?

Which data type should I use to handle nine-digit account numbers and why?

我应该使用哪种数据类型来处理 9 位帐号,为什么?

varchar(9)intdecimal 或其他什么?

我是从数据库的角度谈的 — 而 DBMS 是 Informix。

TL;DR 使用 CHAR(9).

您有多种选择,其中大部分都在评论中提及。这些选项有不同的权衡。它们包括:

  • CHAR(9)。这使用 9 个字节的存储空间,但可以存储前导零,并且可以节省应用程序中的格式设置。您可以编写一个检查约束以确保该值始终包含 9 位数字。如果您以后需要使用更长的数字,您可以轻松地将类型扩展为 CHAR(13)CHAR(16) 或其他任何类型。
  • INTEGER。这使用 4 个字节的存储空间。如果您需要前导零,则必须自己格式化它们。如果以后需要更多数字,则需要将类型更改为 BIGINT.
  • SERIAL。这可以用在一个 table 上,并且当您在列中插入零时会自动生成新值。交叉引用 tables 将使用 INTEGER 类型。
  • DECIMAL(9,0)。这使用 5 个字节的存储空间,并且不存储前导零,因此您必须自己格式化它们。如果以后需要更多数字,可以将类型更改为 DECIMAL(13,0)DECIMAL(16,0) 或其他。
  • BIGINTBIGSERIAL。这些是 8 字节整数,可以毫无问题地将您带到 16 位数字。您必须自己提供前导零。
  • INT8SERIAL8 — 不要使用这些类型。
  • VARCHAR(9)。不太合适,因为长度不是可变的。磁盘上需要 10 个字节,其中 9 个字节就足够了。
  • LVARCHAR(9)。这比 VARCHAR(9).
  • 更不合适
  • NCHAR(9)。这可以用作本质上等同于 CHAR(9),但如果您只打算存储数字,您也可以使用 CHAR(9).
  • NVARCHAR(9)。不合适的原因与 VARCHAR(9)NCHAR(9) 不合适的原因相同。
  • MONEY(9,0)。基本上等同于 DECIMAL(9,0) 但可能会吸引货币符号——最好使用 DECIMAL(9,0).

任何其他类型都很快不合适,除非您设计一个扩展类型,该扩展类型使用 INTEGER 进行存储但提供到 CHAR(9) 的转换函数以添加前导零。