MySQL 5.7のJSON型がConnector/Jから使えないはなし
mysql

MySQL 5.7のJSON型がConnector/Jから使えないはなし

このエントリーをはてなブックマークに追加

こんにちは、ぬいぐるみが好きな方のDBAです。

MySQL 5.7では JSONデータ型 がサポートされ、今までTEXT型やBLOB型にJSONを入れていたのに比べて

  • バイナリーフォーマット(らしい)
  • 容量が小さいのでTEXT型に比べて基本的にレイテンシーが低い
  • 何も考えなくても4バイト文字も入る

というメリットがあります。

( ´-`).oO(Generated Columnでインデックスが張れるとか、json_*関数でアクセスできるとかはTEXT型でもできるのでJSON型のメリットじゃないし、型としてのバリデーションも生JSONを自分で組み立てることはほとんどない(ライブラリー通すから)からあんまり旨味を感じない。。

というわけでwktkしながら作ったんですよ、JSON型カラム。

そしたら。

ギョザー: とりあえずConnector/JのあとのDBアクセスライブラリの結果はStringで、文字化けている
とうふ  : JSONをパースして突っ込むところからJavaで試してみていただきたい
とうふ  : Death
とうふ  : http://bugs.mysql.com/bug.php?id=80631
とうふ  : コンソールからは見えます
ギョザー: 流れてるパケット見る限りUTF-8な文字列がちゃんと来てますね
ギョザー: エンコードせずにINSERTしたやつも問題はない
ギョザー: https://github.com/mysql/mysql-connector-j/blob/5.1.38/src/com/mysql/jdbc/ResultSetImpl.java#L5284
ギョザー: ここでISO-8859-1が返ってきてて、それで処理されちゃってる

IDEで何か(よくわからぬ。。)を走らせて、文字化けされたデータを見せてもらうと、utf8な文字をlatin1(ISO-8859-1)として表示した時によくある感じの化け方をしてた。
こんなかんじ。

1       yoku0825        {"role": "MySQLおじさん"}
1       yoku0825        {"role": "MySQLa??a??a??a??"}

あいやー(´・ω・`)

取り敢えずその時見付けた  Bug#80631 の “Affects Me” をポチるも、元のレポーターがどこかに行ってしまって、”No Feedback”のステータスで漬物化。

しかし俺には再現コードを書く能力はない。ついでに祖父が他界した。ガッデム。とかなってたら、ギョザー氏が再現コード作って 援護射撃 してくれました。

Connector/J で MySQL 5.7のJSON型を使ってみたいと思う日本の方は”Affects Me”していただけると幸いです。ってか、してもらえないと多分未来永劫日本語でこの組み合わせが使えないので何卒どうぞ。。

MySQL Bugs: #80631: ResultSet.getString return garbled result with json type data


専門分野が全然違うギョザー氏とDBAとでごちゃごちゃ話しながら、1つの問題に立ち向かったのが何となくちょっと楽しかったのでした。


名無しのエンジニア
Facebook F8 レポート
新卒2年目の2人がGoogle I/O 2016 に行ってきた話