Mysql InnoDB如何存储字符列?
这个问题只涉及InnoDB表中如何存储'short'Mysql InnoDB如何存储字符列?,mysql,mariadb,innodb,utf8mb4,Mysql,Mariadb,Innodb,Utf8mb4,这个问题只涉及InnoDB表中如何存储'short'CHAR和VARCHAR列 CHAR(10)列是否正好占用10个字节 尾随空格会发生什么情况 对于每个字符需要超过1字节的字符集呢 VARCHAR(10)与CHAR(10)有何不同 EXPLAIN意味着所有索引的varchar都包含一个2字节长度的字段。它真的是2字节吗?或者可能是1字节?(cfkey\u len) 不同的行格式如何 本问题未涉及(避免过于宽泛): 那么TEXT呢 255、191、页外存储等呢 在以char/varchar
CHAR
和VARCHAR
列
列是否正好占用10个字节CHAR(10)
- 尾随空格会发生什么情况
- 对于每个字符需要超过1字节的字符集呢
与VARCHAR(10)
有何不同CHAR(10)
意味着所有索引的varchar都包含一个2字节长度的字段。它真的是2字节吗?或者可能是1字节?(cfEXPLAIN
)key\u len
- 不同的
行格式如何
- 那么
呢TEXT
- 255、191、页外存储等呢
- 在以char/varchar开头的索引中发生了什么。(思考:删除公共前缀。)
- 当涉及到
内存时,char/varchar会发生什么情况。另外,在8.0版中会发生什么变化
对较长的字符串列有显著影响,主要是在决定何时使用页外存储时行_格式
CHAR
和VARCHAR
值之间的区别在于它们的存储方式,CHAR(10)
需要10字节的存储空间,无论您使用多少字符,VARCHAR(10)
只需要1字节(在1字节字符集中)+长度前缀(1当长度小于等于255时,2否则…我不知道为什么要为EXPLAIN
添加2个字节)
我不明白你用尾随空格是什么意思,尽管我可以想象你指的是尾随空格过多,用VARCHAR
这些空格会被警告截断,同时在CHAR
列中这些空格会被无声地截断,这有一定的意义,因为CHAR
与尾随空格一起存储在结束
关于本文中的字符集,您可以看到CHAR
或VARCHAR
的字符数是相同的,不过,您的存储将需要每个字符1到4个字节,即支持的字符集列表和每个字符的字节数
我读到的不同行格式的内容
冗余行格式特征:
InnoDB在内部以固定长度的格式存储固定长度的字符列,如CHAR(10)。InnoDB不会截断VARCHAR列的尾随空格。
InnoDB将长度大于或等于768字节的固定长度字段编码为可变长度字段,可将其存储在页外。例如,如果字符集的最大字节长度大于3,则字符(255)列可以超过768字节,utf8mb4就是这样。
紧凑行格式特征:
- 在内部,对于非可变长度字符集,InnoDB存储 固定长度的字符列,如固定长度的字符(10) 格式 InnoDB不会截断VARCHAR中的尾随空格 列
- 在内部,用于可变长度字符集,如utf8mb3和 在utf8mb4中,InnoDB尝试通过修剪将字符(N)存储在N个字节中 尾随空格。如果CHAR(N)列值的字节长度超过 N字节,InnoDB将尾部空格修剪到列的最小值 值字节长度。字符(N)列的最大长度为 最大字符字节长度×N InnoDB为CHAR(N)保留至少N个字节。保留 在许多情况下,最小空间N使列更新能够在 放置时不会导致索引页出现碎片。相比之下, 对于行\格式=冗余,字符(N)列占据最大值 字符字节长度×N InnoDB对大于或等于768字节的固定长度字段进行编码 长度为可变长度字段,可在页外存储。 例如,如果最大值为 字符集的字节长度大于3,这与 utf8mb4 ROW_FORMAT=动态,ROW_FORMAT=压缩句柄字符存储 与ROW_FORMAT=COMPACT的方式相同
如果我没有弄错的话:varchar存储在一个溢出页面上,而char将存储在一个普通页面上。但是我想您需要更深入的信息“关于在MySQL中使用UTF-8字段”的链接基本上仍然正确(8年后),但需要更新以反映
utf8mb4
和ROW_格式
。MySQL 8.0正在从固定长度的临时存储转移。至于EXPLAIN
所说的“2”(何时应该是“1”),这就是EXPLAIN
太懒了,无法获得隐藏长度字段的确切长度。非常感谢,这解释了为什么不考虑长度前缀字节的长度。此答案中的最后一个链接已断开,可能是因为此答案编写后文档发生了更改。但是,对于相同的pro,还有其他一些来源在谷歌上可以找到se(例如,加上第三方,有些诚实,有些阴暗,要么存档,要么剽窃).基于这些来源,我尽了最大努力找出什么是引号,什么不是引号,并用自己的引号块标记每个不同的引号。但是,这个答案仍然可以通过链接修复和格式改进来实现。