- January 31, 2008 10:16 AM
問題
latin1のデータをselect into outfileでエクスポート/ダンプして、load data infileでインポートすると、警告がでてうまくいかない。
mysql> use world; Database changed mysql> show tables; +-----------------+ | Tables_in_world | +-----------------+ | city | | country | | countrylanguage | +-----------------+ 3 rows in set (0.13 sec)mysql> select * into outfile 'c:\cl.txt' from countrylanguage;
Query OK, 984 rows affected (0.19 sec)mysql> create database world2;
Query OK, 1 row affected (0.09 sec)mysql> use world2;
Database changed
mysql> create table cl like world.countrylanguage;
Query OK, 0 rows affected (0.22 sec)mysql> load data infile 'c:\cl.txt' into table cl;
Query OK, 984 rows affected, 17 warnings (0.06 sec)
Records: 984 Deleted: 0 Skipped: 0 Warnings: 11Error (Code 1406): Data too long for column 'Language' at row 132
Error (Code 1366): Incorrect string value: '\x9Aua' for column 'Language' at row 257
Error (Code 1366): Incorrect string value: '\x9Aua' for column 'Language' at row 271
Error (Code 1406): Data too long for column 'Language' at row 289
Error (Code 1366): Incorrect string value: '\xE1huatl' for column 'Language' at row 357
Error (Code 1406): Data too long for column 'Language' at row 378
Error (Code 1366): Incorrect string value: '\x9Aua' for column 'Language' at row 379
Error (Code 1406): Data too long for column 'Language' at row 419
Error (Code 1406): Data too long for column 'Language' at row 462
Error (Code 1406): Data too long for column 'Language' at row 470
Error (Code 1366): Incorrect string value: '\x9Au' for column 'Language' at row 505
Error (Code 1406): Data too long for column 'Language' at row 544
Error (Code 1406): Data too long for column 'Language' at row 546
Error (Code 1406): Data too long for column 'Language' at row 606
Error (Code 1406): Data too long for column 'Language' at row 624
Error (Code 1366): Incorrect string value: '\x9Aam' for column 'Language' at row 637
Error (Code 1406): Data too long for column 'Language' at row 839
mysql> show warnings;
+-------+------+----------------------------------------------------------------------+
| Level | Code | Message |
+-------+------+----------------------------------------------------------------------+
| Error | 1406 | Data too long for column 'Language' at row 132 |
| Error | 1366 | Incorrect string value: '\x9Aua' for column 'Language' at row 257 |
| Error | 1366 | Incorrect string value: '\x9Aua' for column 'Language' at row 271 |
| Error | 1406 | Data too long for column 'Language' at row 289 |
| Error | 1366 | Incorrect string value: '\xE1huatl' for column 'Language' at row 357 |
| Error | 1406 | Data too long for column 'Language' at row 378 |
| Error | 1366 | Incorrect string value: '\x9Aua' for column 'Language' at row 379 |
| Error | 1406 | Data too long for column 'Language' at row 419 |
| Error | 1406 | Data too long for column 'Language' at row 462 |
| Error | 1406 | Data too long for column 'Language' at row 470 |
| Error | 1366 | Incorrect string value: '\x9Au' for column 'Language' at row 505 |
| Error | 1406 | Data too long for column 'Language' at row 544 |
| Error | 1406 | Data too long for column 'Language' at row 546 |
| Error | 1406 | Data too long for column 'Language' at row 606 |
| Error | 1406 | Data too long for column 'Language' at row 624 |
| Error | 1366 | Incorrect string value: '\x9Aam' for column 'Language' at row 637 |
| Error | 1406 | Data too long for column 'Language' at row 839 |
+-------+------+----------------------------------------------------------------------+
Windowsのプロンプト上からは正しくlatin1の文字を確認できない。
putty(latin1に設定)などを使ってLinuxなどを経由することで、正しくWorldデータベースのテーブルがlatin1で入っていることは確認できた。
またDOSプロンプトを使わないで、Query Browser経由でも、確認できそう。
またダンプしたファイルは、秀丸で文字コードを「欧文(L)」にすることで正しくlatin1の文字を確認できた。
また該当のテキスト全体を
とで囲んで、ブラウザで開いた後に
文字コードセットをISO-8859-1(Latin1)に指定することでも確認できるそうな。
ので、問題はload data infileする際のcharacter setと思われる。
回答
LOAD DATA INFILEはcharacter_set_database変数のcharacter setを使う
character_set_databaseは、そのデータベースのdefault character setから引っ張ってくる
latin1のデータを入れる場合に必要な方法は、以下のどれか
1.character_set_databaseを変更する
mysql> set character_set_database='latin1';
Query OK, 0 rows affected (0.00 sec)
2.LOAD DATA INFILEに明示的にcharacter setを指定する
mysql> load data infile 'c:\cl.txt' into table cl character set latin1; Query OK, 984 rows affected (0.02 sec) Records: 984 Deleted: 0 Skipped: 0 Warnings: 0
3.Database作成時にdefault character setを指定しておく
mysql> create database world3 default character set latin1; Query OK, 1 row affected (0.00 sec)mysql> create table world3.cl like cl;
Query OK, 0 rows affected (0.00 sec)mysql> use world3;
Database changed
mysql> load data infile 'c:\cl.txt' into table cl;
Query OK, 984 rows affected (0.02 sec)
Records: 984 Deleted: 0 Skipped: 0 Warnings: 0