我应该使用哪种数据类型来处理九位帐号,为什么?
Which data type should I use to handle nine-digit account numbers and why?
我应该使用哪种数据类型来处理 9 位帐号,为什么?
varchar(9)
或 int
或 decimal
或其他什么?
我是从数据库的角度谈的 — 而 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)
或其他。
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)
的转换函数以添加前导零。
我应该使用哪种数据类型来处理 9 位帐号,为什么?
varchar(9)
或 int
或 decimal
或其他什么?
我是从数据库的角度谈的 — 而 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)
或其他。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)
的转换函数以添加前导零。