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