load data local infile時にMySQLで文字化けしてしまう

ちょっとハマったのでメモ

  • MySQL5.1.71
  • CentOS 5.2

MySQLでSjisファイルをロードするときに文字化けしてしまう

$ export LANG=ja_JP.sjis	# 効かない
$ mysql -uroot -hhost -ppass --local-infile=1 --default-character-set=sjis << Eof
use mysql
;
set names sjis	# 効かない
;
load data local infile "sjis.txt" into table table
;
Eof

悩みました

$ mysql -uroot -hhost -ppass --local-infile=1 --default-character-set=sjis << Eof
use mysql
;
set character_set_database=sjis	 # これでOK
;
load data local infile "sjis.txt" into table table
;
Eof

どうやらDBの設定がおかしかったようです

mysql> show global variables like "%charac%";
+--------------------------+--------------------------------------------------------------+
| Variable_name						| Value																												|
+--------------------------+--------------------------------------------------------------+
| character_set_client		 | latin1																											 |
| character_set_connection | latin1																											 |
| character_set_database	 | latin1																											 |
| character_set_filesystem | binary																											 |
| character_set_results		| latin1																											 |
| character_set_server		 | latin1																											 |
| character_set_system		 | utf8																												 |

これを変更するにはmy.cnfに設定し再起動すればOKです

$ vi my.cnf
[mysql]
default_character_set = sjis
[mysqld]
character-set-server=sjis

グローバル変数もこうなります

mysql> show global variables like "%charac%";
+--------------------------+----------------------------+
| Variable_name						| Value											|
+--------------------------+----------------------------+
| character_set_client		 | sjis											 |
| character_set_connection | sjis											 |
| character_set_database	 | sjis											 |
| character_set_filesystem | binary										 |
| character_set_results		| sjis											 |
| character_set_server		 | sjis											 |
| character_set_system		 | utf8											 |