MySQLのvarchar定義長さはバイトか文字か
7330 ワード
この問題は多くの人を悩ませていると信じています.特に他のデータベース(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;
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;
このように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;
- +----+--------------------------------+--------------+-------------------+
- | 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)
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;
- +----+----------------------+--------------+-------------------+
- | 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)
このように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;
- +----+-----------------+--------------+-------------------+
- | 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)