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