S2Container+S2Dao.PHP5を使ってみる(番外ハマり編)

S2Dao.PHP5を使うことになってはじめてpdoでmysqlに接続したのですが、その中で2つ、困った問題にぶち当たりました。

  • まずはS2Daoでテーブルにデータを挿入しようとしても、どうしても挿入できない、という問題
  • もう一つは、テーブルに挿入したデータが文字化けする、という問題

最初の問題は、S2Baseで用意されたLoginSample\app\commons\dicon\pdo.diconのdataSourceの設定の問題でした。トランザクション使用を前提にしている為か、デフォルトで下記の設定項目があるのですが、PDO::ATTR_AUTOCOMMITをfalseとしています。これによりpdo接続時にmysqlでset autocommit = 0となり、コミットしない限りクエリ結果が確定しない、という状態だったのでした。このPDO::ATTR_AUTOCOMMITをtrueに変更したら問題は解決したのですが(トランザクション使用せず、の条件で)、アホなことにこれに気付くのに数時間以上かかりました。で、実はトランザクション関係についてはまたあとで悩むことになるのですが、それはとりあえず置いときます...。

        <property name="option">
            array(PDO::ATTR_ORACLE_NULLS => PDO::NULL_EMPTY_STRING,
					PDO::ATTR_AUTOCOMMIT => false);
        </property>

もう一つの問題ですが、これまでmysql4.1.12とphpで作業していましたが、配布されているwindowsバイナリは、インストールするとclientのcharacter-setがlatin1になってしまってます。これはもう変更しようがない。serverはutf8で、データベースのテーブルも全てutf8なので日本語を挿入すると思いっきり文字化けします。pdoを使う前は、接続時にまずset names utf8を発行して解決していたと思うのですが(そして.netでプログラム時は文字化けはしなかった)、S2Daoでまた文字化けが起きて参りました。my.iniでinit-connect=set names utf8とか書いても全然無駄で、pdo側で設定するのかと思ってもどうしようもないし...。結局、調べたところmysql4.1.15以降で導入されたskip-character-set-client-handshakeを使えばなんとかなるかも、とのことだったのでまずmysql4.1.20をインストールし直し、下記設定で見事問題は解消しました。これも夜中に一人で何時間もハマった挙句です。しかしこれは本当にハマる人多いんじゃないですかね。バイナリでclientをlatin1に固定するなら、my.iniに最初からskip-character-set-client-handshakeを設定しておいて欲しい位です。

[mysqld]
skip-character-set-client-handshake