PHPとMySQLにはまる

実は外部公開するWeb系のシステムを作ることになっている。外部に公開するため、現在あるWebサーバー(ホスティングサービス利用)の環境調査の結果、Apache(2.0.50)、PHP(4.3.7)、MySQL(4.0.15)だと分かった。日本語もルーマニア語も扱う予定なのでUTF-8に対応していないとならない。PHPの方はmbstringを使うことをあらかじめ分かっていたので、調査の時点で後でインストールさせてもらうよと告げておいた。

事の起こり

しかし、よく調べてみるとMySQL(4.0.15)事態にも問題がある。というかこちらの方が重要かも。というのもMySQL(4.0系)は、キャラクターセット(character set)としてUTF-8が扱えないから。。。(泣)。しょうがないので、土日で調査をするはめになった(月曜日から首都に上がるからどうしても、調べたかったのさ。この仕事一筋は日本人だなぁと思う)。

PHPMySQLの連携動作原理

まず、googleさんを使って調べていくと、既にいろいろと問題と解決方法が載っている(安心)。原理まで調べてるページがあって、ほんとうに助かったよ。



ここです

どうやらこのページによるとPHPMySQLの連携動作原理は次のようらしい。

PHPアプリ
↓↑
mysql.so(Apache内のモジュールかな?)
↓↑
libmysqlclient.so←――――――→MySQL Server

で、どうしたの?

で、今の問題は既存のPHPアプリがあるので既存のPHP(4.3.7)及びMySQL(4.0.15)を残しつつ、UTF-8に対応したMySQL(4.1系)を導入して文字化けせずうまくデータを扱えるかということだ。更にストレートにすると次のようになる。

  1. libmysqlclient.so(4.0系)を使って4.1系のMySQLサーバーに接続して文字化けが発生しないか?
  2. MySQL(4.0.15)とMySQL(4.1系)を両立させ以下のことができるか?
    1. 僕が作るアプリはポートの設定のみでMySQL(4.1系)に接続できるか?
    2. 今までのアプリはポートの設定・アプリの変更無しでMySQL(4.0.15)に接続できるか?
結果は?

できました(ふぅ)

具体的にはどうした?

まず、MySQL Server(4.1.系)をデフォルトとは異なるデータディレクトリとポート、ソケットを使うように設定する。次に、呼び出しもとのPHPアプリでマシン名とポートを設定する。これだけ。

なぜか文字化けは発生しなかった。理由はおそらく、MySQL Server(4.1系)上のキャラクターセットを自動的にlibmysqlclient.so(4.0系)が使うから。ここ参照。また、SET NAMES binary及びSET NAMES utf8としても(当然)文字化けは起こらなかった。まぁ、最終的にはアプリ内でSET NAMESを定義できるよう(安全のため)設定できるようにするつもりだけどね。

ちょっと、嫌なのがlocalhostという文字列で同じサーバーのMySQLサーバーに接続できないことかな。どうやら、localhostという文字列を使うと否応なしに、socketを使うらしい。localhost:XXXXというポートを含む指定にしても駄目だった。まぁ、この辺は自分で設定することだから全然問題は無いんだけどね。

というような感じで解決したのだが、職場のネットがうまく使えないのでネットカフェに行って資料集めたりした。しかもネットカフェでメモリースティックにセーブできないのでdosコマンドを駆使して無理やりセーブしたりした(笑)。疲れたね〜