5

MySQLのドキュメントによると、5.0以降、varcharの長さはバイトではなく文字単位を参照します。ただし、最近、指定されたvarchar列に収まるはずの値を挿入すると、データが切り捨てられるという警告が表示されるという問題が発生しました。

この問題をv5.1の単純なテーブルで複製しました

mysql> show create table test\G
*************************** 1. row ***************************
Table: test
Create Table: CREATE TABLE `test` (
  `string` varchar(10) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

次に、UTF8文字の量が異なる複数の10文字の値を挿入しました

mysql> insert into test (string) values 
    -> ('abcdefghij'),
    -> ('ãáéíçãáéíç'),
    -> ('ãáéíç67890'),
    -> ('éíç4567890'),
    -> ('íç34567890');
Query OK, 5 rows affected, 4 warnings (0.06 sec)
Records: 5  Duplicates: 0  Warnings: 4

mysql> show warnings;
+---------+------+---------------------------------------------+
| Level   | Code | Message                                     |
+---------+------+---------------------------------------------+
| Warning | 1265 | Data truncated for column 'string' at row 2 |
| Warning | 1265 | Data truncated for column 'string' at row 3 |
| Warning | 1265 | Data truncated for column 'string' at row 4 |
| Warning | 1265 | Data truncated for column 'string' at row 5 |
+---------+------+---------------------------------------------+

mysql> select * from test;
+------------+
| string     |
+------------+
| abcdefghij |
| ãáéíç |
| ãáéíç |
| éíç4567 |
| íç345678 |
+------------+
5 rows in set (0.00 sec)

これは、varcharサイズがまだバイト単位で定義されているか、少なくとも文字単位では正確ではないことを示していると思います。

問題は、ドキュメントを正しく理解しているか、これはバグかということです。または、ドキュメントを誤って解釈していますか?

4

1 に答える 1

7

VARCHARとCHARのサイズがバイトではなく文字で考慮されるのは事実です。

接続文字セットをlatin1(シングルバイト)に設定すると、問題を再現できました。

次のコマンドで挿入クエリを実行する前に、接続文字セットがUTF8に設定されていることを確認してください。

SET NAMES utf8

これを行わないと、2バイトのUTF8文字が2つのシングルバイト文字として送信されます。

デフォルトのクライアント文字セットを変更することを検討してください。

于 2012-05-01T18:35:59.893 に答える