最近在研究 MySQL 的数据类型,我们知道,选择合适的数据类型和数据长度对 MySQL 的性能影响是不可忽视的,小字段意味着可以 MySQL 可以读取更多的记录,从而加快查询速度。
网上该问题的答案有很多版本,还是通过实践得出的结论比较靠谱。
先说结论(MySQL 版本 5.7.27)
- CHAR 最大 255字符 ,字符集对 CHAR 没有影响,CHAR() 括号内填写最大字符数 255
-
VARCHAR 最大 65535字节,字符集对 VARCHAR 有影响
- UTF8 字符集,每个字符大小 3 字节,所以 65535/3 = 21845,最大支持 21845 字符,因此 VARCHAR()括号中最大填写 21845 字符
- GBK 字符集,每个字符大小 2 字节,所以 65535/2 = 32767.5,最大支持 32767字符 ,因此 VARCHAR() 括号中最大填写 32767 字符
验证过程
CHAR
UTF8 字符集(1 个字符占用 3 个字节)
CREATE TABLE `test`.`demo` (`id` int(0) UNSIGNED NULL AUTO_INCREMENT,
`title` char(256) NULL,
PRIMARY KEY (`id`)
) CHARACTER SET = utf8 COLLATE = utf8_general_ci;
MySQL 提示错误
1074 - Column length too big for column 'title' (max = 255); use BLOB or TEXT instead
GBK 字符集(1 个字符占用 2 个字节)
CREATE TABLE `test`.`demo` (`id` int(0) UNSIGNED NULL AUTO_INCREMENT,
`title` char(256) NULL,
PRIMARY KEY (`id`)
) CHARACTER SET = gbk COLLATE = gbk_chinese_ci;
MySQL 提示错误
1074 - Column length too big for column 'title' (max = 255); use BLOB or TEXT instead
结论:CHAR 最大长度和字符集没有关系,因此 CHAR()括号内填写字符大小,最终数据的字节大小随着字符集不同而不同
VARCHAR
UTF8 字符集(1 个字符占用 3 个字节)
CREATE TABLE `test`.`demo` (`id` int(0) UNSIGNED NULL AUTO_INCREMENT,
`title` varchar(65535) NULL,
PRIMARY KEY (`id`)
) CHARACTER SET = utf8 COLLATE = utf8_general_ci;
MySQL 提示错误
1074 - Column length too big for column 'title' (max = 21845); use BLOB or TEXT instead
MySQL 提示的最大长度为 21845,通过 UTF8 字符集的大小可知 VARCHAR()括号中指的是字符大小。
UTF8MB4 字符集(1 个字符占用 4 个字节)
CREATE TABLE `test`.`demo` (`id` int(0) UNSIGNED NULL AUTO_INCREMENT,
`title` varchar(65535) NULL,
PRIMARY KEY (`id`)
) CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci;
MySQL 提示错误
1074 - Column length too big for column 'title' (max = 16383); use BLOB or TEXT instead
MySQL 提示的最大长度为 16383,通过 UTF8MB4 字符集大小可知 VARCHAR()括号中指的是字符大小。
更多原创文章,尽在每天进步一点点