MySQLのvarchar定義長さはバイトか文字か


この問題は多くの人を悩ませていると信じています.特に他のデータベース(Oracleなど)を使ったことがある人は、これまでこの問題をあまり気にしていませんでした.また、本やネット上の文章が細かくなく、テストしたことがなく、私はずっと間違っていました.次に、文字とバイトの違いを例に挙げて説明します.文字人々が使う記号、抽象的な意味での記号.1つの漢字と英語は1つの文字で、例えば'1','中','a','$','¥',......バイトコンピュータの中でデータを格納するユニット、1つの8ビットのバイナリ数、1つのとても具体的な記憶空間で、例えば0 x 01,0 x 45,0 xFA、......詳しくは参考にすることができますhttp://www.regexlab.com/zh/encoding.htmああ、関連概念を正しく理解することが大切です.文字とバイトの違いを理解すれば、以下は簡単です.環境:CentOS 5.x,MySQL5.1.x UTF 8文字セット下: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,'一二三四五六七八九十一');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;
   
   
   
   
  1. +----+--------------------------------+--------------+-------------------+  
  2. | id | name                           | length(name) | char_length(name) |  
  3. +----+--------------------------------+--------------+-------------------+  
  4. |  1 | 1234567890                     |           10 |                10 |  
  5. |  2 |              |           30 |                10 |  
  6. |  3 | abcdefghig                     |           10 |                10 |  
  7. +----+--------------------------------+--------------+-------------------+  
  8. rows in set (0.00 sec) 

GBK文字セットの下: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,'一二三四五六七八九十一');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;
   
   
   
   
  1. +----+----------------------+--------------+-------------------+  
  2. | id | name                 | length(name) | char_length(name) |  
  3. +----+----------------------+--------------+-------------------+  
  4. |  1 | 1234567890           |           10 |                10 |  
  5. |  2 |    |           20 |                10 |  
  6. |  3 | abcdefghig           |           10 |                10 |  
  7. +----+----------------------+--------------+-------------------+  
  8. rows in set (0.00 sec) 

このようにvarcharで定義された長さの単位は文字であり、1つのマルチバイト文字でも1文字であり、中国語や英語のアルファベットなどは1文字として扱われている.ではvarcharが定義できる最大長はどのくらいですか?これはあなたが現在使用している文字セットと関係があります.文字を抜きにすると、最大長は65535バイト(これは最大行サイズで、すべての列で共有されます)ですが、異なる文字セットの下に置くと、UTF 8の下で21845のように定義できる最大長が異なります.MySQL 5ではvarcharの長さも文字だそうですが、MySQL 4ではバイトで、確認されていませんが、興味のある環境は自分で測ることができます.ちなみにcharデータ型で定義される長さも文字で、最大長は255です.SQL>create table test(id int auto_increment,name char(5),primary key(id)); Query OK, 0 rows affected (0.09 sec) SQL>insert into test values(null,'123'); Query OK, 1 row affected (0.00 sec) SQL>insert into test values(null,'12345'); 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,'一二三四五');Query OK, 1 row affected (0.00 sec) SQL>insert into test values(null,123456); 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>select id,name,length(name),char_length(name) from test;
   
   
   
   
  1. +----+-----------------+--------------+-------------------+  
  2. | id | name            | length(name) | char_length(name) |  
  3. +----+-----------------+--------------+-------------------+  
  4. |  1 | 123             |            3 |                 3 |  
  5. |  2 | 12345           |            5 |                 5 |  
  6. |  3 |             |            9 |                 3 |  
  7. |  4 |         |           15 |                 5 |  
  8. +----+-----------------+--------------+-------------------+  
  9. rows in set (0.00 sec)