かみぽわーる

kamipo's blog

MySQL 8.0ではデフォルトで濁点半濁点を区別しなくなる

4月にMySQL 8.0のUnicodeと日本語対応についてManyi Luさんとディスカッションする会があって、かなりいろいろ話してとてもよい会だった。その後いろいろ考えて感じてる懸念を端的に書き記しておく。

デフォルトのcollationがutf8mb4_0900_ai_ciになった

これに関して僕は強い懸念を持っている。MySQL 8.0以前において、ふつうのWebアプリケーションなどで日本語を扱う場合、実用上デフォルトのutf8mb4_general_ciかutf8mb4_binの2択であったと思う。デフォルトがutf8mb4_general_ciなので新しく作られるアプリケーションは通常は濁点半濁点が区別される状態で世に出てくることになる。けどMySQL 8.0.1のデフォルトのutf8mb4_0900_ai_ciは濁点半濁点を区別しないので、将来ユーザー名を登録するところでバイトさんが登録してたらハイドさんは登録できないみたいなことが今よりも多く起きるだろうと思われる。

どうなればいいと思っているか

MySQL 8.0以前のutf8mb4のデフォルトのcollationであるutf8mb4_general_ciにはSMP文字(絵文字とか)を0xFFFD (REPLACEMENT CHARACTER)として比較するという問題がある。この挙動はdocumentedなので仕様だけど、そもそも2010年にMySQL 5.5 GAが出たときにこの挙動でutf8mb4を世に出してしまったことはこの際バグであったこととして、utf8mb4_general_ciのASCII範囲外のBMP文字と同様文字コードで比較するように修正するか修正した新たなcollationを用意して、デフォルトのcollationは修正版utf8mb4_general_ciであるほうが困る人が少ない選択だと思う。既存のcollationの挙動を変えてしまうと互換性の問題があるのだと思うけど(たとえば既存のすでに作られているインデックスは0xFFFDとして作られているところを文字コードで探索はできない等)、個人的にはデフォルトのcollationをutf8mb4_0900_ai_ciに変えるのに比べて許容できる非互換だと思うしバグ修正といって差し支えないように思う。

といった感じでデフォルトのcollationが変わることに関しての懸念を書きましたが、用途に応じて適切に設定すればMySQL 8.0は21世紀最高のMySQLになることをプロミスします!💫

SEE ALSO