utf8的字符集:


SQL >创建测试表(ID int auto_increment varchar(10),名,主键(ID));
SQL >插入测试值(null,'1234567890);
查询OK,1行受影响(0秒)
SQL >插入测试值(null,yiersansiwuliuqibajiushi);
查询OK,1行受影响(0秒)
SQL >插入测试值(null,'abcdefghig);
查询OK,1行受影响(0.01秒)
插入到测试值(null,12345678901);
错误1406(22001):太长column'name'at 1行数据
SQL >插入测试值(null,1'Yiersansiwuliuqibajiushi);
错误1406(22001):太长column'name'at 1行数据
SQL >插入测试值(null,yiersansiwuliuqibajiushiyi);
错误1406(22001):太长column'name'at 1行数据
SQL >选择ID、名称、长度(名字),char_length(名称)从测试;

+ -- + + + + -------------------------------- -------------- -------------------
| ID | |名称长度(名字)char_length(名字)| |
+ -- + + + + -------------------------------- -------------- -------------------
| 1 1234567890 10 10 | | | |
| 2 | yiersansiwuliuqibajiushi | 30 | 10 |
| 3 | abcdefghig | 10 | 10 |
+ -- + + + + -------------------------------- -------------- -------------------
3行(0秒)




GBK字符集:


SQL >创建测试表(ID int auto_increment varchar(10),名,主键(ID));
SQL >插入测试值(null,'1234567890);
查询OK,1行受影响(0秒)
SQL >插入测试值(null,yiersansiwuliuqibajiushi);
查询OK,1行受影响(0秒)
SQL >插入测试值(null,'abcdefghig);
查询OK,1行受影响(0.01秒)
插入到测试值(null,12345678901);
错误1406(22001):太长column'name'at 1行数据
SQL >插入测试值(null,1'Yiersansiwuliuqibajiushi);
错误1406(22001):太长column'name'at 1行数据
SQL >插入测试值(null,yiersansiwuliuqibajiushiyi);
错误1406(22001):太长column'name'at 1行数据
SQL >选择ID、名称、长度(名字),char_length(名称)从测试;

+ -- + + + + ---------------------- -------------- -------------------
| ID | |名称长度(名字)char_length(名字)| |
+ -- + + + + ---------------------- -------------- -------------------
| 1 1234567890 10 10 | | | |
| 2 | yiersansiwuliuqibajiushi | 20 | 10 |
| 3 | abcdefghig | 10 | 10 |
+ -- + + + + ---------------------- -------------- -------------------
3行(0秒)




可以看出,定义为varchar的长度特征,甚至1多字节字符是1个字符,如中文和英文字母为1个字符。

那么什么是varchar可以定义的最大长度这与当前使用的字符集有关。字符的最大长度为65535字节,这是所有列共享的最大行大小,并且当放置在不同字符集时可以定义的最大长度是不同的。例如,默认是21845。据说在mysql5 varchar的长度也是性格,mysql4是字节。未经证实的、感兴趣的环境可以用本身。

顺便说一下,char数据类型定义的长度也是字符,最大长度为255。


SQL >创建测试表(ID int auto_increment,名字char(5),主键(ID));
查询OK,0行受影响(0.09秒)
SQL >插入测试值(null,'123);
查询OK,1行受影响(0秒)
SQL >插入测试值(null,'12345);
查询OK,1行受影响(0秒)
插入到测试值(null,‘123');
查询OK,1行受影响(0秒)
插入到测试值(null,‘12345');
查询OK,1行受影响(0秒)
插入到测试值(null,123456);
错误1406(22001):太长column'name'at 1行数据
插入到测试值(null,12345 - 1′);
错误1406(22001):太长column'name'at 1行数据
SQL >选择ID、名称、长度(名字),char_length(名称)从测试;

+ -- + + + + ----------------- -------------- -------------------
| ID | |名称长度(名字)char_length(名字)| |
+ -- + + + + ----------------- -------------- -------------------
| 1 123 3 3 | | | |
| 2 12345 5 5 | | | |
| 3 123 9 3 | | | |
| 4 12345 15 5 | | | |
+ -- + + + + ----------------- -------------- -------------------
4行(0秒)