- DBD::mysql
4.041
と4.042
の間でmysql_enable_utf8(mb4)
時の文字列の扱いに変化があった- 日本語を扱う上で影響が大きい
- 正確には
4.041
と4.041_01
の差分 diff
4.041
まで MySQL server へ送る際、バイナリ文字列はそのまま、テキスト文字列はencode_utf8
相当の処理を経由しよしなにしていた4.042
からはバイナリ文字列を渡してもencode_utf8
相当の処理が行われる?-
Input bind parameters of binary types (SQL_BIT, SQL_BLOB, SQL_BINARY, SQL_VARBINARY and SQL_LONGVARBINARY) are not touched regardless of the mysql_enable_utf8 attribute state.
- とあるが常に
encode_utf8
されていそう - binary types なカラムを
SELECT
してきた値はバイナリのまま(従来より)
- とあるが常に
-
- アプリケーション内部では JSON はバイナリ文字列で保持したい
- シリアライズした表現であることを期待している
- そのままクライアントに返したり Redis 等別のミドルウェアに渡したりしたい
- バイナリ型のカラムへの INSERT 時にバイナリ文字列を渡しても
encode_utf8
相当の処理が行われるのはこまる - JSON は諦めて MySQL へ入れるところだけ
decode_utf8
してしまってもよいが、普通にバイナリデータを入れたい時はどうするのか - テストコードを読んでいると binary types とは
$sth->bind_param(1, $blob, DBI::SQL_BINARY)
のような INSERT をさすようだDBI
の$sth->execute
は-
If any arguments are given, then execute will effectively call "bind_param" for each value before executing the statement. Values bound in this way are usually treated as SQL_VARCHAR types unless the driver can determine the correct type (which is rare), or unless bind_param (or bind_param_inout) has already been used to specify the type.
-
determine the correct type
できなかった場合SQL_VARCHAR
として扱われる- これによってバイナリ文字列の INSERT に失敗していそう
- 多くのライブラリは
execute
を呼んでいる- 型を指定する方法あるのか? なさそう 😇
mysql_enable_utf8(mb4)
をやめてしまうか? SELECT した値を都度decode_utf8
することになる...