いまさらMySQLのcharsetとcollationの話

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 が一致していれば(もしくは変換可能な定義どうしであれば)不整合は起きない

そのた

勉強になりました。なむなむ