我正在设计我的数据库结构。有许多列是固定长度的,其中至少有一列是纯字母数字的。因此我想知道:对于固定长度的列,通常最有效的数据类型是什么?对于固定长度的字母数字列,最有效的数据类型是什么?为什么?
c90pui9n1#
简而言之:正如塔德曼所说:“使用varchar,不用担心”长话短说:列所消耗的空间是空间和速度的主要因素。可以声明真正固定长度的字符串 CHAR(..) . 通常,它们只由ascii字符组成,因此“正确”的方法是,例如
CHAR(..)
country_code CHAR(2) CHARACTER SET ascii uuid CHAR(36) CHARACTER SET ascii
固定长度之间的差异 VARCHAR 而不是 CHAR 是实际字符串前面的1字节或2字节长度字段。除非你有数十亿行,否则这不是什么大事。处理速度差异不大,但是 CHAR 以及 ascii 赢。如果您有所有的数字字符串,您可能需要使用 INT 4字节或 BIGINT 8字节或 DECIMAL(30) 14个字节等等--而不是使用 CHAR 或者 VARCHAR ,每个数字将有1个字节。数值字段都是固定长度的。但是,要小心。美国电话号码是固定长度的,但国际号码各不相同。你的意思是除了“字母数字”之外还有别的东西。如果你指的是 BINARY / VARBINARY / BLOB ,则规则基本相同。例如,uuid可以从 CHAR(36) (36字节)到 BINARY(16) (16字节)通过适当的转换。后者在速度和空间方面更好,但会增加代码的复杂性(不管怎样,uuid对于大表来说是很糟糕的;这是另一个主题。)对于整数,始终考虑 BIGINT 与 INT 与 MEDIUMINT 与 SMALLINT 与 TINYINT ,通常会粘上 UNSIGNED . (它们分别占用8/4/3/2/1字节)在最初创建表时执行;做作业很麻烦 ALTER 以后再说。
VARCHAR
CHAR
ascii
INT
BIGINT
DECIMAL(30)
BINARY
VARBINARY
BLOB
CHAR(36)
BINARY(16)
MEDIUMINT
SMALLINT
TINYINT
UNSIGNED
ALTER
6mw9ycah2#
使用 VARCHAR 别担心。这只是当您处理的数据太多,无法安装在单个驱动器上,或者甚至无法安装在充满驱动器的单个服务器上时才需要考虑的问题。管理数十亿行数据库的公司在这方面有问题,但只有到了这么大的规模才会有问题。
2条答案
按热度按时间c90pui9n1#
简而言之:正如塔德曼所说:“使用varchar,不用担心”
长话短说:
列所消耗的空间是空间和速度的主要因素。
可以声明真正固定长度的字符串
CHAR(..)
. 通常,它们只由ascii字符组成,因此“正确”的方法是,例如固定长度之间的差异
VARCHAR
而不是CHAR
是实际字符串前面的1字节或2字节长度字段。除非你有数十亿行,否则这不是什么大事。处理速度差异不大,但是
CHAR
以及ascii
赢。如果您有所有的数字字符串,您可能需要使用
INT
4字节或BIGINT
8字节或DECIMAL(30)
14个字节等等--而不是使用CHAR
或者VARCHAR
,每个数字将有1个字节。数值字段都是固定长度的。但是,要小心。美国电话号码是固定长度的,但国际号码各不相同。你的意思是除了“字母数字”之外还有别的东西。如果你指的是
BINARY
/VARBINARY
/BLOB
,则规则基本相同。例如,uuid可以从
CHAR(36)
(36字节)到BINARY(16)
(16字节)通过适当的转换。后者在速度和空间方面更好,但会增加代码的复杂性(不管怎样,uuid对于大表来说是很糟糕的;这是另一个主题。)对于整数,始终考虑
BIGINT
与INT
与MEDIUMINT
与SMALLINT
与TINYINT
,通常会粘上UNSIGNED
. (它们分别占用8/4/3/2/1字节)在最初创建表时执行;做作业很麻烦ALTER
以后再说。6mw9ycah2#
使用
VARCHAR
别担心。这只是当您处理的数据太多,无法安装在单个驱动器上,或者甚至无法安装在充满驱动器的单个服务器上时才需要考虑的问题。
管理数十亿行数据库的公司在这方面有问题,但只有到了这么大的规模才会有问题。