mysql で sjis の csv をインポートする

mysql を使っていて、db 自体は utf8 なのだが、dbのネタとして提供される csvsjis で、こいつをインポートする必要が出てきた。

ほかには迷惑をかけず load するファイルの文字コードを指定するには、このセッション限り有効な文字コード指定をすればいい。 set character_set_database=… だ。こいつで sjis 指定すればいい。

set character_set_database=sjis;

load data infile "/tmp/filename.csv"
into table db.example
…
…

こんな感じで csv ファイルを読み込んだら、ほとんど問題なく取り込めたのだけど、数文字だけ取り込めないってことが起きた。何文字かだけ 「?」 になってしまうのだ。

load コマンド終了後に warning が数件あるぞと表示され、show warning で確かにいくつかの文字の認識に失敗している。

そう、sjis で表現される範囲は何気に狭いのだ。こういうときは cp932 と指定するのが良い。

set character_set_database=cp932;

load data infile "/tmp/filename.csv"
into table db.example
…
…

これで無事いくつかの文字が 「?」 になってしまうのを回避できた。