- 10.9.1 utf8mb4 文字セット (4 バイトの UTF-8 Unicode エンコーディング)
- 10.9.2 utf8mb3 文字セット (3 バイトの UTF-8 Unicode エンコーディング)
- 10.9.3 utf8 文字セット (utf8mb3 のエイリアス)
- 10.9.4 ucs2 文字セット (UCS-2 Unicode エンコーディング)
- 10.9.5 utf16 文字セット (UTF-16 Unicode エンコーディング)
- 10.9.6 utf16le 文字セット (UTF-16LE Unicode エンコーディング)
- 10.9.7 utf32 文字セット (UTF-32 Unicode エンコーディング)
- 10.9.8 3 バイト Unicode 文字セットと 4 バイト Unicode 文字セット間の変換
Unicode 標準には、Basic Multilingual Plane (BMP) の文字と BMP の外部にある補助文字が含まれています。 このセクションでは、MySQL での Unicode のサポートについて説明します。 Unicode 規格自体の詳細は、「Unicode Consortium の web サイト」を参照してください。
BMP 文字には次の 3 つの特性があります。
コードポイント値は 0 から 65535 (または
U+0000
とU+FFFF
) の間です。これらは、8、16 または 24 ビット (1 から 3 バイト) を使用して可変長エンコーディングでエンコードできます。
これらは、16 ビット (2 バイト) を使用して固定長エンコーディングでエンコードできます。
主要言語のほとんどすべての文字には、これらで十分です。
補助文字は BMP の外部にあります:
コードポイント値は、
U+10000
とU+10FFFF
の間です。Unicode による補助文字のサポートには、BMP 文字の範囲外の文字セットが必要であるため、BMP 文字 (文字当たり最大 4 バイト) よりも多くの領域が必要です。
Unicode データをエンコードするための UTF-8 (8 ビット単位の Unicode 変換形式) メソッドは、RFC 3629 に従って実装されます。RFC 3629 には、1 バイトから 4 バイトまでのエンコーディング順序が記述されています。 UTF-8 の概念は、長さの異なるバイトシーケンスを使用してさまざまな Unicode 文字をエンコードするというものです。
基本的なラテン文字、数字、句読点は 1 バイトを使用します。
拡張ラテン文字 (チルダ、長音符号、アキュート、グラーヴェ、およびほかのアクセント符号)、キリル文字、ギリシャ語、アルメニア語、ヘブライ語、アラビア語、シリア語などのほとんどのヨーロッパおよび中東のスクリプト文字は、2 バイトシーケンスに収まります。
韓国語、中国語、および日本語の表意文字は、3 バイトまたは 4 バイトのシーケンスを使用します。
MySQL では、次の Unicode 文字セットがサポートされます:
utf8mb4
: Unicode 文字セットの UTF-8 エンコーディング。文字ごとに 1 バイトから 4 バイトを使用します。utf8mb3
: Unicode 文字セットの UTF-8 エンコーディング。文字ごとに 1 バイトから 3 バイトを使用します。utf8
:utf8mb3
のエイリアス。ucs2
: 文字ごとに 2 バイトを使用した Unicode 文字セットの UCS-2 エンコーディング。utf16
: 文字ごとに 2 バイトまたは 4 バイトを使用する Unicode 文字セットの UTF-16 エンコーディング。ucs2
と似ていますが、補助文字の拡張子が付いています。utf16le
: Unicode 文字セットの UTF-16LE エンコーディング。utf16
と似ていますが、ビッグエンディアンではなくリトルエンディアンです。utf32
: 文字ごとに 4 バイトを使用する Unicode 文字セットの UTF-32 エンコーディング。
utf8mb3
文字セットは非推奨であり、将来の MySQL リリースで削除される予定です。 かわりに utf8mb4
を使用してください。 utf8
は現在 utf8mb3
のエイリアスですが、ある時点では utf8
が utf8mb4
への参照になることが予想されます。 utf8
の意味があいまいにならないように、utf8
ではなく文字セット参照に utf8mb4
を明示的に指定することを検討してください。
表10.2「Unicode 文字セットの一般的な特性」 には、MySQL でサポートされている Unicode 文字セットの一般的な特性がまとめられています。
表 10.2 Unicode 文字セットの一般的な特性
文字セット | サポートされる文字 | 文字ごとに必要な記憶域 |
---|---|---|
utf8mb3 , utf8
|
BMP のみ | 1 バイト、2 バイトまたは 3 バイト |
ucs2 |
BMP のみ | 2 バイト |
utf8mb4 |
BMP および補足 | 1、2、3 または 4 バイト |
utf16 |
BMP および補足 | 2 バイトまたは 4 バイト |
utf16le |
BMP および補足 | 2 バイトまたは 4 バイト |
utf32 |
BMP および補足 | 4 バイト |
BMP の外部の文字は REPLACEMENT CHARACTER と比較され、BMP 文字 (utf8mb3
または ucs2
) のみをサポートする Unicode 文字セットに変換される場合は'?'
に変換されます。
補助文字をサポートし、BMP 専用の utf8mb3
および ucs2
文字セットより「「広い」」である文字セットを使用する場合、アプリケーションに互換性のない問題が発生する可能性があります。セクション10.9.8「3 バイト Unicode 文字セットと 4 バイト Unicode 文字セット間の変換」 を参照してください。 このセクションでは、テーブルを (3 バイト)utf8mb3
から (4 バイト)utf8mb4
に変換する方法と、その実行時に適用される制約についても説明します。
類似した一連の照合順序を、ほとんどの Unicode 文字セットで使用できます。 たとえば、それぞれにデンマーク語照合順序があり、その名前は utf8mb4_danish_ci
, utf8mb3_danish_ci
, utf8_danish_ci
, ucs2_danish_ci
, utf16_danish_ci
および utf32_danish_ci
です。 例外は utf16le
であり、2 つの照合順序しかありません。 Unicode 照合およびそれらの区別プロパティ (補助文字の照合プロパティを含む) の詳細は、セクション10.10.1「Unicode 文字セット」 を参照してください。
UCS-2、UTF-16、および UTF-32 の MySQL での実装は、ビッグエンディアンのバイト順で文字を格納し、値の先頭にバイト順マーク (BOM) を使用しません。 ほかのデータベースシステムでは、リトルエンディアンのバイト順または BOM を使用していることもあります。 このような場合は、これらのシステムと MySQL 間でデータを転送するときに値の変換を実行する必要があります。 UTF-16LE の実装はリトルエンディアンです。
MySQL は UTF-8 値に BOM を使用しません。
Unicode を使用してサーバーと通信するクライアントアプリケーションでは、クライアント文字セットを適宜設定する必要があります (たとえば、SET NAMES 'utf8mb4'
ステートメントを発行します)。 一部の文字セットは、クライアントの文字セットとして使用できません。 SET NAMES
または SET CHARACTER SET
でこれらを使用しようとすると、エラーが発生します。 許可されていないクライアント文字セットを参照してください。
以降のセクションでは、MySQL における Unicode 文字セットについてさらに詳しく説明します。