建表语句:
CREATE TABLE `test2` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`content` varchar(21842) NOT NULL DEFAULT '',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci;
该表中varchar类型的字段能容纳的最大字符数21842是怎么得来的?
21842 = (65535-1-2-4)/3
MySQL 要求一个行的定义长度不能超过65535个字节(包括多个字段),所以有65535.
varchar的最大有效长度取决于最大行大小.
减1的原因是实际行的存储从第2个字节开始.
减2的原因是varchar头部的2个字节表示长度.
减4的原因是字段id的int类型占用4个字节.
除以3的原因是一个utf8字符占用3个字节.
如果你在test2表里把varchar(21842)改为varchar(21844),那么就会报以下错误:
1118 - Row size too large.
The maximum row size for the used table type, not counting BLOBs, is 65535.
This includes storage overhead, check the manual.
You have to change some columns to TEXT or BLOBs.