JUST FOR FUN

Twitter:@okwra GitHub:@tearon4

MySQLでcsvファイルをインポートしようとしたらハマった

作業メモ。 タイトルの通り、MySQLcsvファイルをインポートしようとしたらハマったのでその対応策まとめ。

MySQLInnoDBの行ロック周りのあれこれを勉強しようと思って、ネットで拾ったデータをCSV形式にして手元に保存。

CSVデータのインポートコマンドについては...

qiita.com

さっそくローカルのMySQLでデータをインポートしようと試みたところ

mysql> LOAD DATA LOCAL INFILE '/tmp/hoge.csv' INTO TABLE zuno_o FIELDS TERMINATED BY ',' ENCLOSED BY '"';
ERROR 1148 (42000): The used command is not allowed with this MySQL version

と出てしまった。
「えーversionとか...なんだ、面倒だけどアプデとかしないとダメなのかー?」
と最初は思ったが
(あれ?手元のversionそんなに古くないはずだぞ?)
と思い、とりあえずググることに。

(mysql) コマンド行クライアントの場合、--local-infile[=1] オプションを指定することによって LOAD DATA LOCAL を有効にするか、--local-infile=0 オプションを指定することによってこれを無効にします。

(中略)

サーバーまたはクライアントのいずれかで LOAD DATA LOCAL が無効な場合、そのようなステートメントを発行しようとしたクライアントは次のエラーメッセージを受け取ります。

ERROR 1148: The used command is not allowed with this MySQL version

MySQL 5.6 リファレンスマニュアル LOAD DATA LOCAL のセキュリティーの問題

詳しくは上のURLを読んで欲しいですが、セキュリティがらみの問題でデフォルトではできなくなっている模様。

ということで...

$ mysql -u (USER) -p (PASSWORD) --local_infile=1

...

mysql> LOAD DATA LOCAL INFILE '/tmp/hoge.csv' INTO TABLE hoge FIELDS TERMINATED BY ',' ENCLOSED BY '"';
Query OK, 18 rows affected, 28 warnings (0.00 sec)
Records: 22  Deleted: 0  Skipped: 4  Warnings: 28

やったぜ!!

ちなみに、my.cnfに

[client]
loose-local-infile=1

を追加するのでもOK。