此问题仅涉及'简短' CHAR
和VARCHAR
列存储在InnoDB表中。
CHAR(10)
列是否只占用10个字节?VARCHAR(10)
与CHAR(10)
的区别如何?EXPLAIN
表示所有索引变量都包含一个2字节长的字段。真的是2个字节吗?或者它可能是1个字节? (cf key_len
)。ROW_FORMATs
怎么样?本课题未涉及(为防止其过于宽泛):
TEXT
。MEMORY
临时表时,char / varchar会发生什么。此外,版本8.0中发生了哪些变化。ROW_FORMAT
对较长的字符串列有重大影响,主要是决定何时使用页外存储。答案 0 :(得分:2)
来自MySQL Documentation:
CHAR
和VARCHAR
值的区别在于它们的存储方式,CHAR (10)
需要10个字节的存储空间,无论您使用多少个字符,因为数据是用空格填充的,VARCHAR (10)
只占用1个字节(1字节字符集)+长度前缀(长度为255或更小时为1,否则为2 ......我不知道为什么EXPLAIN
的key_len加2字节)
我不明白你的尾随空白是什么意思,虽然我可以想象你指的是多余的尾随空格,VARCHAR
这些被截断并带有警告,同时在CHAR
列中这些空格被静默截断,这有一些意义,因为CHAR
最后存储了尾随空格。
关于此link中的字符集,您可以看到CHAR
或VARCHAR
的字符数相同,但是,您的存储空间需要1到4个字节character,here是支持的字符集列表,here是每个字符的字节数。
我读过innoDB
的不同行格式冗余行格式特征:
在内部,InnoDB存储固定长度的字符列,例如 CHAR(10)采用固定长度格式。 InnoDB不会截断尾随 来自VARCHAR列的空格。
InnoDB对大于或等于768字节的固定长度字段进行编码
长度为可变长度的字段,可以在页外存储
例如,如果最大
的话,CHAR(255)列可以超过768个字节
字符集的字节长度大于3,因为它与
utf8mb4。
COMPACT行格式特征:
在内部,对于非变长字符集,InnoDB存储 固定长度的固定长度字符列,例如CHAR(10) 格式。 InnoDB不会截断VARCHAR的尾随空格 列。
在内部,对于可变长度的字符集,例如utf8mb3和 utf8mb4,InnoDB尝试通过修剪将CHAR(N)存储为N个字节 尾随空格。如果CHAR(N)列值的字节长度超过 N个字节,InnoDB将尾随空格修剪为列的最小值 值字节长度。 CHAR(N)列的最大长度是 最大字符字节长度×N。
InnoDB为CHAR(N)保留至少N个字节。保留 在许多情况下,最小空间N可以完成列更新 放置而不会导致索引页面碎片。通过比较, 对于ROW_FORMAT = REDUNDANT,CHAR(N)列占用最大值 字符字节长度×N。
InnoDB对大于或等于768字节的固定长度字段进行编码 长度为可变长度字段,可以在页外存储。 例如,如果最大值,CHAR(255)列可以超过768个字节 字符集的字节长度大于3,与之一样 utf8mb4。
ROW_FORMAT = DYNAMIC和ROW_FORMAT = COMPRESSED处理CHAR存储 与ROW_FORMAT = COMPACT相同。
DYNAMIC和COMPRESSED行格式是COMPACT行格式的变体,因此以与COMPACT行格式相同的方式处理CHAR存储
希望它对你有所帮助。