即使对于部分填充的单元格,MySQL 中的 varchar/text/longtext 列是否在文件系统中占据完整大小?

Rak*_*kib 9 mysql varchar

即使对于不完整的单元格,MySQL 中的 varchar/text/longtext 列是否占用文件系统中的全长大小?

例如,参考这篇博客文章,我有以下列,并在其中放入了一个给定的字符串。

CHAR (72) - can store upto 72 characters - i put in a string "abcd"
VARCHAR (72) - can store upto 72 characters - i put in a string "abcd"
TINYTEXT - can store upto 255 characters - i put in a string "abcd"
TEXT - can store upto 65,535 characters - i put in a string "abcd"
LONGTEXT - can store upto 4,294,967,295 characters - i put in a string "abcd"
Run Code Online (Sandbox Code Playgroud)

这些列中的每一列将占用多少实际物理空间?每列能够存储的完整大小?还是仅存储“abcd”所需的量?

Ric*_*mes 10

'abcd' inCHAR(72) CHARACTER SET ascii在磁盘上占用 72 个字节。
'abcd' inCHAR(72) CHARACTER SET utf8在磁盘上占用 3*72 字节。
'abcd' inCHAR(72) CHARACTER SET utf8mb4在磁盘上占用 4*72 字节。
'abcd' inVARCHAR(72)在磁盘上占用 1+4 个字节。
'abcd' inTINYTEXT在磁盘上占用 1+4 个字节。
'abcd' inTEXT在磁盘上占用 2+4 个字节。
'abcd' inLONGTEXT在磁盘上占用 4+4 个字节。

更新:在某些版本中,InnoDB 将仅存储 4 个字节的CHAR案例。

注:
1、2、4为长度;VARCHAR可能2在某些情况下。
CHARACTER SET是在所有情况下很重要,但不影响占用的空间由“ABCD”除了CHAR

@akuzminsky - 你对 *3 的看法是错误的。 CHAR(N)并且VARCHAR(N)最多可以容纳N个的声明CHARACTER SET。这将变为 3*N 字节 forCHAR或 1+3*N for VARCHAR

TEXT限制为 65535个字节(加上 2 个字节的长度)。

在上述长度之上还有开销。在 InnoDB 中,有记录标志、事务 id、阻塞因子、指向溢出区域的指针等等。所以,如果你使用这种算法,它会低估使用的磁盘空间。

MyISAM 更节俭;每条记录至少有 1 个字节的开销;在某些情况下,只有 1。