字符集“utf8mb4” - 是否意味着每个字符占用 4 个字节,还是仅那些需要 4 个字节的字符?

Nun*_*uno 4 mysql mariadb utf-8 mysql-8.0 mariadb-10.5

我有一个VARCHAR(80) utf8mb4专栏,我正在测试添加一些 ASCII 和表情符号字符,并使用LENGTH()CHAR_LENGTH()来理解差异。

通过阅读不同的地方,我的理解是,utf8mb4列上的每个字符将占用 4 个字节。LENGTH()然而,如果我理解为给我特定内容在该字段上的实际大小,情况似乎可能并非如此。

包含“aaaa”内容的行比包含“”的行占用的存储空间更少,这是否正确?

在此输入图像描述

Nun*_*uno 7

实际上,我的答案在文档中:\n https://mariadb.com/kb/en/unicode/

\n
\n

每个字符使用一到三个字节的 UTF-8 编码。基本拉丁字母、数字和标点符号使用一个字节。欧洲和中东字母大多适合 2 个字节。韩语、中文和日语\n表意文字使用 3 字节。不存储增补字符。

\n

utf8mb4 -- 与 utf8 相同,但以四个字节存储增补字符。

\n
\n

另外,根据https://mariadb.com/kb/en/data-type-storage-requirements/

\n
\n

字符串数据类型
\n在下面的描述中,M 是声明的列长度(以字符或字节为单位),而 len 是值的实际长度(以字节为单位)。
\nVARCHAR(M) -- 如果列为 0 \xe2\x80\x93 255 字节,则为 len + 1 个字节;如果列可能需要超过 255 个字节,则为 len + 2 个字节

\n
\n

因此,对于VARCHAR(80) utf8mb4,
\n80x4 > 255,因此带有“aaaa”的字段将占用 6 个字节 (len + 2)

\n