日本語の処理

 

日本語の扱いは、MySQL4.0以前と4.1以降では異なる。

 

バイナリで入れる MySQL (v3.23.58、v4.0.25)

一番簡単なのは、MySQLの日本語を入れるカラムをBLOB型にして、そこに問答無用でRevから日本語を入れる方法である。

この場合、"UI, japanese"などとしたフィールドの日本語をそのままMySQLに流し込めばよいはず。また、MySQLのディフォルトキャラクタセットがLatin1だろうとsjisだろうと関係ない。

(ここで言うバイナリは、MySQL v4.1のカラムのBinary型とは異なる。)

 

文字列としてちゃんと入れる MySQL (v3.23.58、v4.0.25)

次のスクリプトは、VARCHAR型カラムに日本語を入れるためのものである。前述の方法と違い、これだと文字としてMySQLが認識する。

put uniDecode(field "name1","Japanese") into name1

このname1を次のスクリプトなどでMySQLに入れればいい。
put "INSERT INTO acc(pro_id, f_name) VALUES(:1, :2)" into tQuery
get revdb_execute(tConnectionId,tQuery,"theID","name1")

驚くべきことに、v3.23.58とv4.0.25では、MySQLのディフォルトキャラクタセットがLatin1だろうとsjisだろうと関係なく、日本語入力ができる。ただし、Latin1の場合、「表通り」などいくつかの単語で文字化けする。しかし、たいていの日本語は普通にMySQLに入力できてしまう。

次のスクリプトは反対にMySQLのVARCHAR型カラムに格納された日本語文字列をRevの"UI,japanese"型フィールドに入れるものである。説明の都合上、
put "SELECT * from acc ORDER BY id" into tQuery
put revdb_queryblob(tConnectionId,tQuery) into curID
put revDatabaseColumnNumbered(curID, c) into storeData

などで既にstoreDtataにMySQLからの日本語文字列が入っている、と仮定する。

set the unicodeText of fld "alldata" to uniencode(storeData,Japanese)

MySQLサーバーのディフォルトキャラクタセットがsjisであってもLatin1であっても上記スクリプトの結果は同じである。
put uniencode(storeData,Japanese) into fld "alldata"と書くと文字化けする。

 

MySQL v4.1.9

4.0以前のバージョンはMySQLサーバーのキャラクタセットがLatin1のままでもそれなりにRevからの日本語入力は可能だった。実際にはRevだけでなくphpMyAdminからでもLatin1に日本語がサクサクと入る。

4.1.x以降では、MySQL側のキャラクタセットを、my.cnfの設定もしくは各テーブル、カラムごとの設定でsjis、utf8などにきちんとしておく必要がある。(Latin1だと見事に文字化けする。)

さらに難解にしているのは、4.1.x以降ではクライアント側のキャラクタセットがサーバー側のキャラクタセットと一致していないと文字化けになる、ということである。詳しい説明はMySQL日本ユーザー会にたくさんあるが、そこに書かれた「4.1の壁」という言葉は、いかに多くの日本人がこの問題に悩んだかを示している。

●対処法
4.1.x以降では、「status」コマンドでサーバ側の文字セット、クライアント側の文字セットを、ともにSJISに設定しただけでは文字化けする。
4.1.xとRevで日本語をやりとりして「????????」と文字化けするなら、RevからSELECT文やUPDATE文を実行する前に、revdb_コマンドで、set names sjisというコマンドを送ってみるべきである。これにはもうひとつ説があってhttp://tod.cocolog-nifty.com/diary/2005/12/xamppphpmysql_6279.htmlによれば、SET CHARACTER SET SJIS; (最後の「 ; 」はrevで送る場合省く)というのもある。もちろんMySQLサーバー側がujisなら...SET UJISと書く。

どうやら、これはクライアント側のその時のキャラクタセットが何であるかをMySQLに宣言するコマンドらしい。phpとMySQLで文字化けする場合も、このコマンドは有効である。

それでも直らない場合、

  • Apache2の場合、httpd.confに、 「AddDefaultCharset ISO-8859」と書かれている行がある。
  • Revの場合は関係ないが、php.iniに 「 ;default_charset = "iso-8859-1"」と書かれている。

などの原因で文字化けするらしい。前者の場合、「AddDefaultCharset none」にすればよい。http://www.mysql.gr.jp/mysqlml/mysql/msg/11901

後者の場合、これを「default_charset="Shift_JIS"」とするとよいようです。

php.iniは、/etc/php.ini、MySQLの設定ファイルmy.cnfは普通はroot/etc/にある。

 

設定ファイルの場所

php.iniは、/etc/php.ini

MySQLの設定ファイルmy.cnfは普通はroot/etc/にある。

httpd.confは、/etc/httpd/conf/httpd.confにある。