MySQL中的CHAR和VARCHAR到底支持多長?


最近在研究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.jpeg


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM