跳至主要內容

字符串类型

AkashiNeko原创MySQL数据类型

定长和变长字符串

CHARVARCHAR 是常见的用于存储字符数据的数据类型,它们分别是定长可变长的:

CHAR 和 VARCHAR

  • CHAR:每个列都占用固定长度的存储空间,对于存储较短的数据可能会浪费一些存储空间。
  • VARCHAR:存储空间根据实际存储的字符数动态分配,因此对于存储较短的数据,它可能更加节省存储空间。

在使用类型时,需要写成 CHAR(n)VARCHAR(n) 的形式,其中 n 表示可存储的最多字符数。

CREATE TABLE str ( s char(3) );
INSERT INTO str VALUES ('abc'),('123'),('SQL'),('汉字'),('数据库');
-- Query OK, 5 rows affected (0.01 sec)
-- Records: 5  Duplicates: 0  Warnings: 0

请注意,这里的字符与字节不同,一个字符可能由多个字节组成。比如在 utf8 编码下,一个汉字字符占 33 个字节,33 个汉字字符需要 99 个字节的空间才能存储;而在 gbk 编码下,一个汉字占 22 个字节,存储 33 个汉字字符只需要 66 个字节的空间。

类型最大长度
CHAR255255 字符
VARCHAR6553565535 字节

CHAR 是定长的,在存储数据时,它使用的空间是固定的。而 VARCHAR 是可变长度的,它使用的空间取决于存储的数据长度。比如在下面的的 strs 表中,s1 列无论存什么数据,都会固定占用 1010 个字节的空间,而 s2 列则是存多少数据占多少空间。

CREATE TABLE strs (
    s1 char(10),
    s2 varchar(20)
);

VARCHAR长度的存储

由于 VARCHAR 是可变长的,MySQL 在存储时需要知道数据的长度,VARCHAR 通常会占用 11 ~ 22 个字节来记录数据长度。由于存在记录长度的空间,所以 VARCHAR 最大能存储的有效数据的字节数为 655352=6553365535-2=65533 个。当数据长度为 00 ~ 255255 时,需要额外使用 11 个字节的空间记录数据长度,长度为 256256 ~ 6553365533 时使用 22 个字节的空间。

MySQL 8.0 默认的 utf8mb4 编码下,一个字符最长可以占用 44 个字节,所以该编码下的 VARCHAR 最长只能存储 65533/4=16383\lfloor 65533/4 \rfloor = 16383 个字符。

CREATE TABLE vc16383 ( s varchar(16383) );
-- Query OK, 0 rows affected (0.02 sec)

CREATE TABLE vc16384 ( s varchar(16384) );
-- ERROR 1074 (42000): Column length too big for column 's' (max = 16383); use BLOB or TEXT instead

文本和二进制类型

TODO