我正处于设计数据库结构的过程中。
有许多固定长度的列,其中至少一列是纯字母数字。
因此我想知道:
答案 0 :(得分:1)
使用VARCHAR
,不用担心。
仅当您处理如此多的数据而无法将其容纳在单个驱动器上,或者甚至是单个服务器卡满了驱动器时,这才是一个问题。
管理具有数十亿行的数据库的公司会遇到此问题,但是只有到那么大时,您才会遇到问题。
答案 1 :(得分:1)
简短的回答:正如塔德曼所说:“使用VARCHAR,不用担心”
长答案:
列占用的空间是空间和速度的主要因素。
可以将完全定长的字符串声明为CHAR(..)
。通常,它们仅由ASCII字符组成,因此例如,“正确”的实现方法是
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
vs INT
vs MEDIUMINT
vs SMALLINT
vs TINYINT
,通常使用UNSIGNED
。 (它们分别占用8/4/3/2/1个字节。)在最初创建表时执行此操作;稍后再进行ALTER
会很麻烦。