MySQLと日本語文字

MySQLで日本語文字を使うために調べたことを記録する。

●基本事項
サーバーではデータベース毎に文字コードセット(コーディング)を決めることができる(表毎、列毎の指定も可能)。またサーバー~クライアント間のデータ送受信時に使用する文字コードセットは随時変更することができる。
従って、DB上の文字列の文字コードに関わらず、クライアントから所望の文字コードセットで文字列を送受信することが可能である。

MySQLはコンパイル時(configure時)にデフォルトで全ての文字コードセットに対応している訳ではないので、日本語文字コードセットに対応するようにコンパイルする(configure実行時に--with-charsetオプションを付ける)必要がある。

動作中のMySQLで使用できる文字コードセットは、クライアントにて

SHOW CHARSET;
で見ることができる。

●サーバー側の文字コードセット指定
デフォルトの文字コードセットは、my.cnfの[server]エントリーのdefault-character-setで指定できる。
特定のDBに対しては、CREATE DATABASEまたはALTER DATABASE文にてCHARACTER SETオプションで指定できる。

●クライアント側の文字コードセット指定
クライアントで使用する文字コードセットは、

SET NAMES '文字コードセット名';
で指定できる。EUCは'ujis'、UTF-8は'utf8'、Shift-JISは'sjis'である。
実際には、これによって関係する複数の環境変数が同時に更新される。
文字コードセットに関係する環境変数の値は、
SHOW VARIABLES LIKE 'character%';
とすると全て見ることができる。

なお、MySQLのinfoを含め色々な所にmy.cnfの[client]エントリーのdefault-character-setにてデフォルトの文字コードセットを設定できるようなことが書かれているが、筆者の環境(FreeBSD 4.11+MySQL 5.0.27)ではその設定は反映されない。Webを見ると、他でも同じ現象が少なからず発生しているようだ。my.cnfにてこれを設定する場合は、1回mysqlを起動して環境変数が意図通りに変わっているかどうか確認しておくべきだと思う。

●LOAD DATA INFILEで使われる文字コードセット
MySQLのLOAD DATA INFILEでファイル読み出し時に使われる文字コードはcharacter_set_databaseの値であり、上述のSET NAMESでは更新されない。従って、対象ファイルにてデフォルトでない文字コードが含まれる場合は、先に

set character_set_database=文字コードセット名;
のようにして設定する必要がある。
なお、文字コードによっては区切り文字の判定に曖昧さが出る可能性があるため、日本語文字列は""(ダブルクォート)で括ってLOAD DATA INFILE文にFIELDS ENCLOSED BY '"'(シングルクォート2つの間にダブルクォート1つ)を指定するなどした方が良いと思う。
(参考:http://www.hirohama.biz/mysql/2008/01/31-100131.html