2013年5月12日
DBD::mysqlでmysql_enable_utf8しつつutf8mb4使いたいとき
今のところの結論として、接続時に
SET NAMES utf8mb4;
するしか無いんじゃないかなーという感じがしている。SET NAMES使うのかよ!ってdisられそうで怖いです。
DBICやTengの場合はon_connect_do、生DBIやSunnyの場合はCallbacksで指定できます。
なんか、mysql_enable_utf8していると、DBD::mysqlがMYSQL_SET_CHARSET_NAMEでutf8に決め打ってしまうので、さらにSET NAMES utf8mb4
して上書きしてやらないといけないという感じ。ソースとしては以下の辺り。
https://github.com/CaptTofu/DBD-mysql/blob/4_022/dbdimp.c#L1803-L1816
DBD::mysql側でなんか対応して欲しい気もするけどどうするのが綺麗なんでしょうかね。
ちなみに、あんま深追いしてないけど、SET CHARACTER SET utf8mb4
だとダメでした。
mysql_enable_utf8は未だexperimentalだけど皆使ってますよね。いちいちデータを全部文字列化するとかだいぶタルくてやってられないし絶対どこかで漏れて文字化けとか起きるし。