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をするといいだろう。

個人用ツール