MySQL 8.0 リファレンスマニュアル


10.9 Unicode のサポート

Unicode 標準には、Basic Multilingual Plane (BMP) の文字と BMP の外部にある補助文字が含まれています。 このセクションでは、MySQL での Unicode のサポートについて説明します。 Unicode 規格自体の詳細は、「Unicode Consortium の web サイト」を参照してください。

BMP 文字には次の 3 つの特性があります。

  • コードポイント値は 0 から 65535 (または U+0000U+FFFF) の間です。

  • これらは、8、16 または 24 ビット (1 から 3 バイト) を使用して可変長エンコーディングでエンコードできます。

  • これらは、16 ビット (2 バイト) を使用して固定長エンコーディングでエンコードできます。

  • 主要言語のほとんどすべての文字には、これらで十分です。

補助文字は BMP の外部にあります:

  • コードポイント値は、U+10000U+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 のエイリアスですが、ある時点では utf8utf8mb4 への参照になることが予想されます。 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 文字セットについてさらに詳しく説明します。


関連キーワード:  文字, セット, バイト, 照合, 順序, utf, サポート, 変換, リファレンス, 一般