omoonのブログ

旅の思い出を写真とともに書いてみるか。

php(+mysql4.1)でmysql4.0に接続

急遽WEBサーバを2台追加しなければならなくなりました。
BIG-IP配下に既にある3台のサーバ群に2台を追加しました。
コンテンツの同期をとって、サービス開始!と思いきや、新しいサーバでDB周りのエラーが発生!
よくよく調べてみたら、古い3台のmysqlのバージョンは3.x。新しいほうは4.1.x。しかもDBサーバは4.0.x。
めちゃめちゃやんけ!。って自分でやったんですが。

その解決までの顛末でございます。

サーバ環境

  • WEBサーバ(php)とDBサーバ(mysql)は別
  • WEBサーバからDBサーバとのクエリのやりとりにはPEARのDBを使っている
  • DBサーバのmysqlのバージョンは4.0.x
  • 文字コードはなぜかsjisで統一(なぜだ?聞かないで!)
  • 既存のWEBサーバのphpはmysql3.xでコンパイルされている
  • 追加するWEBサーバのphpをmysql4.1.xでコンパイルしてしまった
  • ちなみにphpはバージョン4.x

図にするとこんな感じかな

(OK) php(+mysql3.x)----[PEAR DB]-+
                                 |
                                 +- mysql4.0.x
                                 |
(NG) php(+mysql4.1.x)--[PEAR DB]-+

どんな問題がおきたのか

プレースホルダを使って、

$sql = "select * from foo where bar=?";
$db->query($sql, array('表'));

みたいなときに、

select * from foo where bar='表\'

みたいな感じでsjisの2バイト目をエスケープしてしまうやつ。
あ!よくあるヤツだ!きたか!ついにこの問題を目の当たりにするときがきた!

解決へ向けて

それで、つまりあれでしょう、sjisのことやろ?知ってるって。ごめんな。
ってことで、WEBサーバ側のmysql(4.1.x)を、sjisをデフォルト文字コードとしてコンパイルし直してみる。

./configure --prefix=/usr/local/mysql \
            --with-charset=sjis \
            --with-extra-charsets=all \
            --with-mysql-user=mysql 

phpももう一回コンパイルしてと。来たか?どうだ!
えー!ダメだー。なおらない。どうしてー!?


ということで、いろいろさまよいながら、もしや、もしや、このことでは?

http://blog.ohgaki.net/index.php/yohgaki/2005/11/01/mysql_4_1_5_0a_ra_as_a_a_a_e_i


で、これ、コンパイル時に指定できるんじゃないか、と。

./configure --prefix=/usr/local/mysql \
            --with-charset=sjis \
            --with-extra-charsets=all \
            --with-mysql-user=mysql \
            --enable-skip-character-set-client-handshake

できましたとさ。


参考)
http://blog.ohgaki.net/index.php/yohgaki/2005/11/01/mysql_4_1_5_0a_ra_as_a_a_a_e_i
http://www.mysql.gr.jp/frame/modules/bwiki/?FAQ#content_1_40