phpmyadminで文字化けさせない


phpmyadminを使うまでは、Nucleusや Wordpress、開発システムなどを、EUCなりUTFで書き込み、読み出して表示させ文字化けもないので、指定した文字コードで一貫して動作しているものと考えていた。

だが、Wordpressのデータベースを phpmyadminで表示すると、「照合順序 utf8_general_ci」となり、テーブル内の文字は期待通りの日本語で表示されるが、Nucleusのデータベースは、「照合順序 latin1_swedish_ci」となり「e´《?i¨1/4’c”・a°-?a?OEa°¥3a°-?e´《?ae ?c”Y¨」のように内容が文字化けしている。開発システムも同様だ。

MySQLのUTFの指定といえば my.cnfだが、(MySQL 5.0.51a)
[mysqld]
character-set-server = utf8
collation-server = utf8_unicode_ci
init-connect = 'SET NAMES utf8'
skip-character-set-client-handshake

[mysqldump]
default-character-set = utf8

[mysql]
default-character-set = utf8

のように指定をすると、その MySQLで利用する全てのデータベースに適用されてしまう。
昔の EUC-JPで動いているデータベースまで適用されると、そちらで齟齬がでてEUC-JPでの文字化けが発生する。
システムを書き直せばよいが、コスト的に問題がある。
文字コードの指定は個別のデータベースで行いたい。

※ Nucleusでは文字化けだが、WordPressがまともに表示されるなら、そのような指定があるはずである。

やりかたを手っ取り早くいうと
  • my.cnfは default のまま。(cf. debian lenny ... MySQL 5.0.51a))
  • 既存のデータベースから、とにかくエディタ or ブラウザ で読める形式で書き出す。
    ・Nucleusでexportしたgzを変換して urfにするのは難しいのでやめ。
    ・phpmyadminでいろいろexportして、開いて読めたら準備OK。
  • 文字コードをutfに変換する。
      # nkf -w tablename0.txt >tablename.txt
      エディタなどで変換してもいい。
  • utf8形式のデータベースを用意する。
      # mysql create database DatabaseName character set utf8;
    ・Nucleusならinstall時に作っておいたデータベース名を指定する。
  • 同じ構造のデータベースを作る。
      # mysql -e 'CREATE TABLE TabeleName(sn mediumint unsigned, ...)' DatabaseName
  • データを読み込む。
      # mysqlimport --local --delete --replace DatabaseName TabeleName.txt
  • 出し入れするphpのプログラムには
      mysql_select_db(dbname) or die (print"なんたらかんたら");
      の後に、
      mysql_query("SET NAMES utf8");
      を記述する。
Nucleusは、install時に自動的にテーブルが作成される。
Nucleusなら、install後にデータをimportする。画像なども同じディレクトリにuploadしておく。permissionの設定も適宜行う。
# usermod -G www-data username
で、ユーザにグループを追加するのもいい。
この場合は、chown -R username:www-data nucleusDirectory
usermodの確認は
# id -a username

Nucleusを「character set utf8」で指定し構築すると、「照合順序 utf8_general_ci」にはなる。
だが、単純に 既存データを utf-8に変換して importしたとき、 逆に Nucleusが文字化けを作り出す可能性がある。

明らかになるまで深追いはせず、とりあえずこの状態のままで

Nucleusの「mysql_connect」の後に「mysql_query("SET NAMES utf8");」がなければ入れればいいのだが、一度改造すると、以後 upgradeのたびにメンテナンスが必要になるので思案中。
インストール時に config.phpあたりに文字コード「$charCD="utf8"」が登録されて、「"SET NAMES ".$charCD」で動くようになると最高なのだが。
...Nucleus全部を文字検索し「mysql_connect」を探して直後にいれればよさげ。

NucleusCMS_3.41Releaseでは、
NucleusCMS_3.41Release/install.php
NucleusCMS_3.41Release/libs/globalfunctions.php
NucleusCMS_3.41Release/libs/mysql.php
の3本に「mysql_connect」がある。

MySQLは3xあたりで使い始めたが コマンドラインと shell scriptでデータ操作していたので phpmayadminを使う習慣がなかった。
2.9xあたりから 使いだしたがもう手放せない。
トバイアス・ラチチュラーとメンテナの皆さんに感謝。

03 Oct, 2009 | mokimoc
« Prev item - Next Item »
---------------------------------------------

Comments



Leave comments

このアイテムは閲覧専用です。コメントの投稿、投票はできません。