MySQL中的CHAR和VARCHAR到底支持多长

37次阅读

共计 1520 个字符,预计需要花费 4 分钟才能阅读完成。

最近在研究 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()括号中指的是字符大小。


更多原创文章,尽在每天进步一点点

正文完
 0