LOAD DATA INFILE時の文字コード
提供:MySQL Practice Wiki
MySQLサーバへ高速にデータを格納する方法として、LOAD DATA INFILEステートメントがあるが、この際に用いる文字コードセットはクライアントが接続に用いるものとは違うので注意が必要だ。LOAD DATA INFILEはSTATUSコマンドにおいてDb charactersetの項目に表示される文字コードを使用する。以下の例ではeucjpmsとなる。
mysql> STATUS -------------- mysql Ver 14.12 Distrib 5.0.56, for apple-darwin9.1.0 (i386) using EditLine wrapper Connection id: 1 Current database: test_eucjpms Current user: mikiya@localhost SSL: Not in use Current pager: stdout Using outfile: Using delimiter: ; Server version: 5.1.22-rc MySQL Community Server (GPL) Protocol version: 10 Connection: Localhost via UNIX socket Server characterset: utf8 Db characterset: eucjpms Client characterset: utf8 Conn. characterset: utf8 UNIX socket: /tmp/mysql-5122.sock Uptime: 1 min 15 sec Threads: 1 Questions: 21 Slow queries: 0 Opens: 16 Flush tables: 1 Open tables: 9 Queries per second avg: 0.280 --------------
この文字コードはどこで決まるのかというと、スキーマ(データベースオブジェクト)作成時、つまりCREATE DATABASE(またはSCHEMA)ステートメント実行時となる。以下はeucjpmsを使用してスキーマを作成する例である。
mysql> CREATE SCHEMA some_schema DEFAULT CHARACTER SET 'eucjpms';
そして、EUCで書かれたテキストファイル(例えばCSV)をMySQLのテーブルへ読み込むには以下のようにする。(テーブル定義は適宜調整のこと。)
mysql> USE some_schema; mysql> LOAD DATA INFILE '/path/to/testfile.txt' INTO TABLE some_table FIELDS TERMINATED BY ',';
スキーマのDEFAULT CHARACTER SETは、LOAD DATAステートメント以外には、そのスキーマ上でテーブルを作成する際にデフォルトの文字コードとして使用される。テーブル作成時に文字コードを明示的に指定する場合や既存のテーブルには影響しない。なのでLOAD DATAのためにスキーマの文字コードを調整する場合は、その前後でALTER SCHEMAをするといいだろう。