メインコンテンツへスキップ

VillageSQL is a drop-in replacement for MySQL with extensions.

All examples on this page work on VillageSQL. Install Now →
MySQL の文字セットは、文字列がどのように格納されるか(どのバイトがどの文字を表すか)を制御します。照合順序は、文字列がどのように比較され、ソートされるかを制御します。最初にこれらを正しく設定しておけば、後から修正するのが大変なデータの破損や誤ったソートを避けられます。

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 = アクセントを区別する。

文字セットの設定

データベース作成時:
テーブル作成時:
列レベル(テーブルのデフォルトを上書き):
列レベルの文字セットは、テーブルの他の列が大文字小文字を区別しない一方で、1 つの列だけ大文字小文字を区別する一致が必要な場合に役立ちます。 列の文字セットを変更する:
テーブル全体を変換する:
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 のエッジケースを正しく扱えません。

トラブルシューティング

関連項目