我刚刚阅读了this question的接受答案,这给我留下了这个问题。
以下是该答案的引用:
“但是既然你用MySQL标记了这个问题,我会提到一个特定于MySQL的提示:当你的查询隐式生成一个临时表时,例如在排序或GROUP BY
时,VARCHAR
字段是转换为CHAR
以获得使用固定宽度行的优势。如果您使用大量VARCHAR(255)
字段用于不需要那么长的数据,这可以使临时表非常大“。
据我所知,CHAR
的优势在于你获得了固定宽度的行,所以同一个表中的VARCHAR
不会混乱吗?如果在同一个表中有CHAR
,使用VARCHAR
会有什么好处吗?
以下是一个例子:
表CHAR
:
CREATE TABLE address (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
street VARCHAR(100) NOT NULL,
postcode CHAR(8) NOT NULL,
PRIMARY KEY (id)
);
没有CHAR
的表:
CREATE TABLE address (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
street VARCHAR(100) NOT NULL,
postcode VARCHAR(8) NOT NULL,
PRIMARY KEY (id)
);
CHAR
的表格是否会比没有CHAR
的表格更好,如果是,那么在什么情况下呢?
答案 0 :(得分:2)
“VARCHAR
”基本上设置字段的最大长度,并仅存储输入的数据,从而节省空间。 “CHAR
”类型具有固定长度,因此如果设置“CHAR(100)
”,则无论内容是什么,都将使用100个字符的空间。
您获得速度优势的唯一时间是您的记录中没有可变长度字段(“VARCHAR
”,“TEXT
”等)。 您可能会注意到在MySQL内部,一旦添加了可变长度字段类型,您的所有“CHAR
”字段都会更改为“VARCHAR
”。
从空间存储的角度来看,“CHAR
”的效率也较低,但搜索和添加效率更高。它更快,因为数据库只需要读取偏移值来获取记录而不是读取部分,直到找到记录的结尾。固定长度记录将最小化碎片,因为已删除的记录空间可以重新用于新记录。
希望它有所帮助。