Your browser doesn't support the features required by impress.js, so you are presented with a simplified version of this presentation.
For the best experience please use the latest Chrome or Safari browser. Firefox 10 (to be released soon) will also handle it.
About me
Rails Contributors in 2015
Rails Contributors in 2015
Planning the defaults for MySQL 5.8
- Character Set and Collation
Planning the defaults for MySQL 5.8
We are considering changing the default character set to utf8mb4. Modern applications frequently store 4 byte characters, as emoji input is common for mobile devices.
Planning the defaults for MySQL 5.8
In addition to utf8mb4, we are also considering switching the default collation to be utf8mb4_unicode_520_ci.
ハハパパ🍣🍺問題
- utf8mb4_general_ci
- utf8mb4_unicode_ci
- utf8mb4_unicode_520_ci
- utf8mb4_bin
🍣🍺問題
- MySQLで文字列の比較に使われるcollating weightの仕様がおかしい
- collating weightがある文字はそれを使う。ない場合は以下に従う。
- BMP文字でgeneral collation (xxx_general_ci)の場合、コードポイントを使う。
- BMP文字でunicode collation (xxx_unicode_ci)の場合、なんかいい感じの計算式で導出する。
- SMP文字(絵文字とか)の場合、0xfffd REPLACEMENT CHARACTERと同じweightになる😳
ハハパパ問題
- MySQLがUnicode Collation Algorithm (UCA)の一部しか実装していない
- UCAではMulti-Level Comparisonといって複数レベルに分けて文字列の比較を行い、各レベルの比較で文字列が一致した場合(tie-breaking level)、次のレベルで比較を行うを繰り返して順序を決定する。
- L1は大文字小文字アクセント無視(Base Charaters)
- L2はアクセントを無視しない(Accents)
- L3は大文字小文字を無視しない(Case/Variants), etc...
ハハパパ問題
- Primary weight range(L1比較のためのweight)しか実装していない
- Base Charatersの区別はされるがアクセント(濁点半濁点)の区別はされない
- 日本語の文字列比較には適さない
- We can't wait utf8mb4_japanese_ci...😫
ハハパパ問題
mysql-5.7.10/strings/ctype-uca.c#L17-L31
/*
UCA (Unicode Collation Algorithm) support.
Written by Alexander Barkov
Currently supports only subset of the full UCA:
- Only Primary level key comparison
- Basic Latin letters contraction is implemented
- Variable weighting is done for Non-ignorable option
Features that are not implemented yet:
- No Normalization From D is done
+ No decomposition is done
+ No Thai/Lao orderding is done
- No combining marks processing is done
*/
まとめ
- utf8mb4_general_ci
- utf8mb4_unicode_ci
- utf8mb4_unicode_520_ci
- utf8mb4_bin
That's all🍻