为什么 MySQL CHAR 数据类型没有前面的长度字节?

Mar*_*tke 3 mysql varchar

在 MySQL 文档中可以发现 CHAR 数据类型没有字符串长度的前置字节。

相反,VARCHAR 数据类型有 1 或 2 个前面的字节,用于存储字符串长度。这是可以理解的。数据库引擎需要知道字符串长度才能读取它。

数据库引擎如何知道 CHAR 数据类型长度是多少?其背后的逻辑/算法是什么?

Bil*_*win 5

https://dev.mysql.com/doc/refman/8.0/en/char.html说:

CHAR 列的长度固定为您在创建表时声明的长度。长度可以是 0 到 255 之间的任意值。存储 CHAR 值时,会在右侧用空格填充到指定的长度。

因此,无需注释每行中的值,因为它始终与为列定义的长度完全相同。无论有多少行属于该表,长度都会在表元数据中存储一次。

而 VARCHAR 在每行上存储为可变长度的字节数,最多可达为列定义的最大值。

在 C 中,他们可能使用以 null 结尾的字符串而不是长度前缀。但在 SQL 中,null 是存储在字符串中的合法字符,因此它不是一个好的字符串终止符。

  • @RickJames,一个 CHAR(N) 可能占用超过 N 个字节。它以每个字符一个字节存储单字节字符,但它根据需要使用尽可能多的字节来存储多字节字符。通过牺牲尾随空格,它还可以保持在 N 字节以内。请参阅https://github.com/mysql/mysql-server/blob/8.0/storage/innobase/row/row0mysql.cc#L495-L516 (2认同)
  • @BillKarwin - 谢谢。换句话说:“CHAR(N)”消耗的空间是 max(N, A),其中 A 是表示任何实际多字节字符所需的最小字节数。如果需要,尾随空格可用作填充。据推测,在比较或测量字符串时,代码会假装字符串已填充到 N 个字符,即使它们实际上并未包含在存储中。 (2认同)