相信这个问题也会困扰不少人,尤其是使用过其它数据库(如Oracle)的人,之前我也没有太在意这个问题,再加上一些书籍和网上的文章讲的不够细致,又没测试过,导致我一直理解错误。下面通过实例来解释,在开始之前先简单介绍下字符和字节的区别。
字符 人们使用的记号,抽象意义上的一个符号。一个汉字和英文就是一个字符,如'1', '中', 'a', '$', '¥',……
字节 计算机中存储数据的单元,一个8位的二进制数,是一个很具体的存储空间,如0x01, 0x45, 0xFA,……
详细的可以参考http://www.regexlab.com/zh/encoding.htm,正确理解相关概念还是很重要的。
好了,如果你已经理解了字符和字节的区别,下面就容易多了。
环境:CentOS5.x,MySQL5.1.x
UTF8字符集下:
SQL>create table test(id int auto_increment,name varchar(10),primary key(id));
SQL>insert into test values(null,'1234567890');
Query OK, 1 row affected (0.00 sec)
SQL>insert into test values(null,'一二三四五六七八九十');
Query OK, 1 row affected (0.00 sec)
SQL>insert into test values(null,'abcdefghig');
Query OK, 1 row affected (0.01 sec)
SQL>insert into test values(null,12345678901);
ERROR 1406 (22001): Data too long for column 'name' at row 1
SQL>insert into test values(null,'一二三四五六七八九十1');
ERROR 1406 (22001): Data too long for column 'name' at row 1
SQL>insert into test values(null,'一二三四五六七八九十一');
ERROR 1406 (22001): Data too long for column 'name' at row 1
SQL>select id,name,length(name),char_length(name) from test;
- +----+--------------------------------+--------------+-------------------+
- | id | name | length(name) | char_length(name) |
- +----+--------------------------------+--------------+-------------------+
- | 1 | 1234567890 | 10 | 10 |
- | 2 | 一二三四五六七八九十 | 30 | 10 |
- | 3 | abcdefghig | 10 | 10 |
- +----+--------------------------------+--------------+-------------------+
- 3 rows in set (0.00 sec)
- +----+----------------------+--------------+-------------------+
- | id | name | length(name) | char_length(name) |
- +----+----------------------+--------------+-------------------+
- | 1 | 1234567890 | 10 | 10 |
- | 2 | 一二三四五六七八九十 | 20 | 10 |
- | 3 | abcdefghig | 10 | 10 |
- +----+----------------------+--------------+-------------------+
- 3 rows in set (0.00 sec)
- +----+-----------------+--------------+-------------------+
- | id | name | length(name) | char_length(name) |
- +----+-----------------+--------------+-------------------+
- | 1 | 123 | 3 | 3 |
- | 2 | 12345 | 5 | 5 |
- | 3 | 一二三 | 9 | 3 |
- | 4 | 一二三四五 | 15 | 5 |
- +----+-----------------+--------------+-------------------+
- 4 rows in set (0.00 sec)
浙公网安备 33010602011771号