我应该使用哪种数据类型来处理九位数的帐号,为啥?
Posted
技术标签:
【中文标题】我应该使用哪种数据类型来处理九位数的帐号,为啥?【英文标题】:Which data type should I use to handle nine-digit account numbers and why?我应该使用哪种数据类型来处理九位数的帐号,为什么? 【发布时间】:2015-11-24 09:25:55 【问题描述】:我应该使用哪种数据类型来处理 9 位帐号,为什么?
varchar(9)
或 int
或 decimal
或其他?
我是从数据库的角度说的——DBMS 就是 Informix。
【问题讨论】:
帐号是否总是正好是 9 位数字,还是需要同时存储0035
和 000000035
?
@LasseV.Karlsen:总是 9 位数字,我进行了验证以强制用户仅输入 9 位数字
如果长度是固定的,我会考虑 char(9)
而不是一些数字类型(主要是因为数字不代表你可以做任何有意义的算术的数字 - 这只是个人喜好不过)。
固定字符,使用插入/更新触发器来验证格式是否始终正确!
根据documentation,INTEGER
数据类型支持 +/- 2^31 的范围,正如@JonSkeet 所说,2,147,483,647,所以是的,它支持 9 位数字。请注意,您必须用零填充数字,因为如果您存储000000035
,然后读回它,它将只是35
,因为在数字上它们是相同的值。然而,在这种情况下,我认为也许你应该选择CHAR(9)
,因为这不是一个真正的数字,你不会用它做任何算术运算,它更像是一个独特的代码。
【参考方案1】:
TL;DR 使用CHAR(9)
。
您有很多选择,其中大部分在 cmets 中都有提及。这些选项有不同的权衡。它们包括:
CHAR(9)
。这使用 9 个字节的存储空间,但可以存储前导零,并且可以节省应用程序中的格式化。您可以编写一个检查约束来确保该值始终包含 9 位数字。如果您以后需要使用更长的数字,您可以轻松地将类型扩展为 CHAR(13)
或 CHAR(16)
或其他。
INTEGER
。这使用 4 个字节的存储空间。如果您需要前导零,则必须自己格式化它们。如果您以后需要更多数字,则需要将类型更改为 BIGINT
。
SERIAL
。这可以在一个表上使用,并且当您在列中插入零时会自动生成新值。交叉引用表将使用 INTEGER
类型。
DECIMAL(9,0)
。这使用 5 个字节的存储空间,并且不存储前导零,因此您必须自己格式化它们。如果您以后需要更多数字,可以将类型更改为 DECIMAL(13,0)
或 DECIMAL(16,0)
或其他。
BIGINT
和 BIGSERIAL
。这些是 8 字节整数,可以毫无问题地将您带到 16 位。您必须自己提供前导零。
INT8
和 SERIAL8
— 不要使用这些类型。
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)
的转换函数,添加前导零。
【讨论】:
以上是关于我应该使用哪种数据类型来处理九位数的帐号,为啥?的主要内容,如果未能解决你的问题,请参考以下文章