« pullreqを別ブランチにマージしたいとかsquash mergeしたいとき | メイン | MySQLのsql-modeで一番厳しいやつはTRADITIONAL »

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だけど皆使ってますよね。いちいちデータを全部文字列化するとかだいぶタルくてやってられないし絶対どこかで漏れて文字化けとか起きるし。

投稿者 Songmu : 2013年5月12日 03:00