xamppというLAMPパッケージのお気楽セットをwindowsに開発環境として導入したが、なんだかmysqlで日本語がまともにとおらない。
最近、コマンドラインの人なのでDOS窓から仕事をするとしたらsjis中心にするしかない。
mysqlの日本語ってどうなってんの?といろいろ調べていたら、「実はみんなよくわかっていない。」windows上でutf-8はUnicodeだからOK, といってみたり, 4.1までの事実上、文字コードを気にしてない実装がよかった!などと自分の低スキルをたてに怒ってる人までいる。データベースマネージメントシステムは文字コード変換を吸収するのが機能のひとつなのに。。。まともな解説の決定版はきっとここ だろうな。ここを参考に備忘録
mysql文字コードおさらい
- sjis
- windowsが主に使う。
- ujis
- Unix向け。sjis+補助漢字
- cp932
- sjis+NEC特殊文字など((株)問題他、日本語問題対処。sambaでおなじみ)
- eucjpms
- ujis+NEC特殊文字
- utf8
- 各国言語が使用可能
- ucs2
- 各国言語が使用可能(Mysql 4.1はucs2を介して文字変換する)
- latin1
- MySQLデフォルトキャラクターセット
これらを自動変換しようとするからややこしいことになる。
mysqlでどう指定するか
次にmy.cnf(xamppの場合、xampp/mysql/bin内)でのセットパラメータを見る。
- character_set_client
- クライアントから入力される文字コード
- character_set_connection
- テーブルアクセスのないサーバ処理の文字コード
- character_set_results
- 返された結果をクライアントに表示する文字コード
- chaaracter_set_server
- Createte Databaseのデファルト文字コード
- character_set_database
- Create tableのデフォルト文字コード
例:サーバー側[mysqld] default-characer-set=sjis クライアント側 [mysql] default-character-set=sjis
しかし、これではクライアント側データベースアクセス用モジュールは変更できない。これがいろんな問題を起こす。
mysqlが直接関係しているモジュールに正しく定義する方法は、
- コンパイル ./configure –with-characterset=xxxx
- 接続直後に SET NAMES xxxx;
- mysql起動オプション –skip-character-set-client-handshake (my.cnfに記述可)
ちなみに、あちこちでinit-connect=SET NAMESで変えられるとあるが、絶対に試してないね。できませんでした。
上記の方法でもPHPがどう扱うかは、別の問題のようだ。
なお、(株)問題、ラウンドトリップ問題に対処するにはcp932が推奨されている。。らしい。
その他
メッセージの日本語化は[mysqld] language=japanese-sjis

