MySQLのload data local infileの際に文字化けする対策
ポイントはcharacter_set_databaseパラメタを確認することでした
環境
- MySQL 5.5.43
- 文字コード utf8
テーブル作成
まずはUTF8でテーブルを作成します。なおデータベースエンジンにはInnodbを使用します
1 2 3 4 5 6 | create table TEST( id integer not null, name varchar(32) null, kana varchar(32) null )engine=innodb default charset=utf8 ; |
ファイルの確認
インポートするファイルの文字コードをUTF8にします
1 2 | $ head TEST.txt |nkf --guess UTF-8 (LF) |
UTF8でない場合には以下のコマンドで変換します
1 2 | $ cat TEST.txt |nkf -w > TEST.txt.utf8 $ mv TEST.txt.utf8 TEST.txt |
データベースの設定
データベースの設定を確認します。なおmysqlコマンド起動時に –local-infile をつけないとload data local infileコマンドがエラーになります。5.5あたりからの仕様変更でしたっけ?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | $ mysql -uroot -hlocalhost -ppassword --local-infile=1 mysql> show global variables like "character%"; +--------------------------+----------------------------+ | Variable_name | Value | +--------------------------+----------------------------+ | character_set_client | latin1 | | character_set_connection | latin1 | | character_set_database | utf8 | | character_set_filesystem | binary | | character_set_results | latin1 | | character_set_server | latin1 | | character_set_system | utf8 | | character_sets_dir | /usr/share/mysql/charsets/ | +--------------------------+----------------------------+ 8 rows in set (0.01 sec) </pre> このグローバル変数のうちcharacter_set_databaseがutf8になっていることを確認します なっていない場合には、以下のコマンドで変更します <pre> mysql> set global character_set_database=utf8; |
一時的に変更したい場合にはこちらのコマンドです。このセッションのみで有効です
1 | mysql> set character_set_database=utf8; |
インポート
それではインポートします
1 | mysq>load data local infile "/path/to/file/TEST.txt" into table TEST; |
これで文字化けせずインポートできます