InnoDB如何存储字符列?

时间:2018-01-24 16:01:51

标签: mysql mariadb innodb utf8mb4

此问题仅涉及'简短' CHARVARCHAR列存储在InnoDB表中。

  • CHAR(10)列是否只占用10个字节?
  • 尾随空白会发生什么?
  • 每个字符需要超过1个字节的字符集呢?
  • VARCHAR(10)CHAR(10)的区别如何?
  • EXPLAIN表示所有索引变量都包含一个2字节长的字段。真的是2个字节吗?或者它可能是1个字节? (cf key_len)。
  • 不同的ROW_FORMATs怎么样?

本课题未涉及(为防止其过于宽泛):

  • TEXT
  • 怎么样?
  • 如何,255,191,页外存储等
  • 以char / varchar开头的索引会发生什么。 (想一想:删除公共前缀。)
  • 当参与MEMORY临时表时,char / varchar会发生什么。此外,版本8.0中发生了哪些变化。
  • ROW_FORMAT对较长的字符串列有重大影响,主要是决定何时使用页外存储。

1 个答案:

答案 0 :(得分:2)

来自MySQL Documentation

CHARVARCHAR值的区别在于它们的存储方式,CHAR (10)需要10个字节的存储空间,无论您使用多少个字符,因为数据是用空格填充的,VARCHAR (10)只占用1个字节(1字节字符集)+长度前缀(长度为255或更小时为1,否则为2 ......我不知道为什么EXPLAIN的key_len加2字节)

我不明白你的尾随空白是什么意思,虽然我可以想象你指的是多余的尾随空格,VARCHAR这些被截断并带有警告,同时在CHAR列中这些空格被静默截断,这有一些意义,因为CHAR最后存储了尾随空格。

关于此link中的字符集,您可以看到CHARVARCHAR的字符数相同,但是,您的存储空间需要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存储

希望它对你有所帮助。