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

Posted

技术标签:

【中文标题】我应该使用哪种数据类型来处理九位数的帐号,为啥?【英文标题】:Which data type should I use to handle nine-digit account numbers and why?我应该使用哪种数据类型来处理九位数的帐号,为什么? 【发布时间】:2015-11-24 09:25:55 【问题描述】:

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

varchar(9)intdecimal 或其他?

我是从数据库的角度说的——DBMS 就是 Informix。

【问题讨论】:

帐号是否总是正好是 9 位数字,还是需要同时存储 0035000000035 @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 个字节的存储空间。如果您需要前导零,则必须自己格式化它们。如果您以后需要更多数字,则需要将类型更改为 BIGINTSERIAL。这可以在一个表上使用,并且当您在列中插入零时会自动生成新值。交叉引用表将使用 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) 的转换函数,添加前导零。

【讨论】:

以上是关于我应该使用哪种数据类型来处理九位数的帐号,为啥?的主要内容,如果未能解决你的问题,请参考以下文章

应该使用哪种数据类型来存储哈希?

mysql往数据库插入float类型的数据 为啥数字不对?

8 位小数的纬度/经度应该使用哪种 MySQL 数据类型?

我的数据使用哪种 lstm 架构以及我应该做啥数据处理

对于不同大小的输入,我应该使用哪种类型的神经网络?

Android:我应该使用哪种图像格式,为啥? [关闭]