我应该使用哪种数据类型来处理9位数字的帐号,为什么?varchar(9)
或int
或decimal
或其他?
我是从数据库角度讲的-DBMS是Informix。
最佳答案
TL; DR 使用CHAR(9)
。
您有很多选择,其中大多数在注释中提到。选项具有不同的权衡。它们包括:
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)
的转换功能并添加前导零的扩展类型,否则任何其他类型都将很快不合适。