字符串类型
原创
定长和变长字符串
CHAR
和 VARCHAR
是常见的用于存储字符数据的数据类型,它们分别是定长和可变长的:
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
编码下,一个汉字字符占 个字节, 个汉字字符需要 个字节的空间才能存储;而在 gbk
编码下,一个汉字占 个字节,存储 个汉字字符只需要 个字节的空间。
类型 | 最大长度 |
---|---|
CHAR | 字符 |
VARCHAR | 字节 |
CHAR
是定长的,在存储数据时,它使用的空间是固定的。而 VARCHAR
是可变长度的,它使用的空间取决于存储的数据长度。比如在下面的的 strs
表中,s1
列无论存什么数据,都会固定占用 个字节的空间,而 s2
列则是存多少数据占多少空间。
CREATE TABLE strs (
s1 char(10),
s2 varchar(20)
);
VARCHAR长度的存储
由于 VARCHAR
是可变长的,MySQL
在存储时需要知道数据的长度,VARCHAR
通常会占用 ~ 个字节来记录数据长度。由于存在记录长度的空间,所以 VARCHAR
最大能存储的有效数据的字节数为 个。当数据长度为 ~ 时,需要额外使用 个字节的空间记录数据长度,长度为 ~ 时使用 个字节的空间。
在 MySQL 8.0
默认的 utf8mb4
编码下,一个字符最长可以占用 个字节,所以该编码下的 VARCHAR
最长只能存储 个字符。
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