Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql InnoDB如何存储字符列?_Mysql_Mariadb_Innodb_Utf8mb4 - Fatal编程技术网

Mysql InnoDB如何存储字符列?

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

这个问题只涉及InnoDB表中如何存储'short'
CHAR
VARCHAR

  • CHAR(10)
    列是否正好占用10个字节
  • 尾随空格会发生什么情况
  • 对于每个字符需要超过1字节的字符集呢
  • VARCHAR(10)
    CHAR(10)
    有何不同
  • EXPLAIN
    意味着所有索引的varchar都包含一个2字节长度的字段。它真的是2字节吗?或者可能是1字节?(cf
    key\u len
  • 不同的
    行格式如何
本问题未涉及(避免过于宽泛):

  • 那么
    TEXT
  • 255、191、页外存储等呢
  • 在以char/varchar开头的索引中发生了什么。(思考:删除公共前缀。)
  • 当涉及到
    内存时,char/varchar会发生什么情况。另外,在8.0版中会发生什么变化
  • 行_格式
    对较长的字符串列有显著影响,主要是在决定何时使用页外存储时
来自MySQL:

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(例如,加上第三方,有些诚实,有些阴暗,要么存档,要么剽窃).基于这些来源,我尽了最大努力找出什么是引号,什么不是引号,并用自己的引号块标记每个不同的引号。但是,这个答案仍然可以通过链接修复和格式改进来实现。