awesome先生*1に基礎を教わってきたので忘れないうちにメモ。
utf8_unicode_ci / utf8_general_ci
- MySQL で default charset を utf8 に指定すると、デフォルトで選ばれるコレーションは utf8_general_ci
- unicode_ci は文字に対して独自の weight map でもって評価する(general_ci は ascii とコードポイントで評価)
- MySQL で実装されている weight map は1階層のみのため、日本語が入る環境では意図しない挙動をする*2
- utf8mb4 も基本的には同一
- ただ utf8mb4_general_ci だと絵文字の評価が厳しいので、やるならコードポイントのみで比較する utf8mb4_bin に設定するしかないとのこと
"default" charset の挙動
- 本来 MySQL は charset / collation を column ごとに適用する
- charset / collation の適用は column を生成するタイミング(多くは create table 時)のみ
- column 生成時に default の指定がなかった場合のみ table => database の順に生成条件を参照し、default charset / collation が指定されていればそれが適用される
- なので、show create database と show create table の charset が違っても慌てる必要はない
- ただし例え alter で table の charset / collation が変更されても、既に存在する column にその設定は適用されない
- column の charset / collation と connection 時の(client の)charset が一致していれば(もしくは変換可能な定義どうしであれば)不整合は起きない