VillageSQL is a drop-in replacement for MySQL with extensions.
All examples on this page work on VillageSQL. Install Now →
utf8mb4 — 正しいデフォルト
常にutf8mb4 を使ってください。MySQL の utf8(mb4 なし)は 3 バイトのエンコーディングで、4 バイトの Unicode 文字を格納できません。これには絵文字、多くの漢字、および各種の記号が含まれます。utf8mb4 は完全な UTF-8 エンコーディングです。
utf8 を使っているレガシーなデータベースの場合、utf8mb4 への移行には、データベース、テーブル、および列の変換が必要です。
文字セットのクイックリファレンス
コストの列は、誤った選択を後から修正するのに必要な作業についてであり、文字セット自体のパフォーマンスコストではありません。
latin1 は罠です。どんなバイト値もエラーなく受け入れるため、不正なデータが静かに入り込み、表示または変換しようとしたときに初めて表面化します。
照合順序
照合順序は、ソート順と比較の動作を決定します。一般的な選択肢は次のとおりです。utf8mb4_0900_ai_ci はデフォルトの照合順序であり、汎用的には最良の選択です。Unicode を正しく扱い、大文字小文字を区別せず(ci)、アクセントも区別しません(ai)。utf8mb4_bin は、バイト単位の正確な一致が必要な場合にだけ使ってください。
ci = 大文字小文字を区別しない、cs = 大文字小文字を区別する、ai = アクセントを区別しない、as = アクセントを区別する。
文字セットの設定
データベース作成時:CONVERT TO は 1 つのステートメントですべての列を変更します。テーブルを再構築するため、テーブルのサイズに比例した時間がかかります。
文字セットの確認
SHOW CREATE TABLE の出力で文字セットが表示されない列は、テーブルのデフォルトを継承しています。
接続の文字セット
接続の文字セットは、MySQL がクライアントから期待し、文字列リテラルに使うエンコーディングを制御します。常に明示的に設定してください。utf8mb4 であるため、明示的な上書きが必要になることはまれです。
照合順序がクエリに与える影響
照合順序はWHERE、ORDER BY、および一意性に影響します。
utf8 から utf8mb4 への変換
レガシーなデータベースがutf8(3 バイト)を使っている場合は、変換します。
utf8mb4 にするため、サーバーの構成も更新します。
よくある質問
MySQL の utf8 が絵文字をサポートしないのはなぜですか?
MySQL の utf8 は、4 バイトの Unicode 拡張より前に作られた、非標準の 3 バイトの UTF-8 サブセットです。絵文字(および他の多くの現代の Unicode 文字)には 4 バイトが必要です。utf8mb4 が UTF-8 の正しい完全な実装です。古い utf8 エイリアスは下位互換性のためだけに存在します。新しいスキーマでは決して使わないでください。
照合順序の変更は既存のデータに影響しますか?
照合順序を変更しても、格納されたバイトは変わりません。変わるのは、それらのバイトがどのように比較され、ソートされるかです。ただし、ユニークインデックスは照合順序を使って強制されるため、_bin から _ci に変更すると、先に解決しなければならない衝突(Alice と alice が等しくなる)が明らかになることがあります。
どの照合順序を使うべきですか?
ほとんどの用途ではutf8mb4_0900_ai_ci です。デフォルトの照合順序であり、Unicode をうまく扱います。utf8mb4_bin は、バイト単位の正確な一致が必要な場合にだけ使ってください。新しいプロジェクトでは utf8mb4_general_ci を避けてください。_0900_ai_ci より古く、一部の Unicode のエッジケースを正しく扱えません。
トラブルシューティング
関連項目
- MySQL の文字列関数 — 動作が照合順序に依存する文字列関数
- MySQL の utf8mb4: 絵文字と完全な Unicode の格納 — utf8 と utf8mb4 の罠と絵文字の格納
- MySQL の大文字小文字の区別 — 照合順序が比較について決めること