第9章 各国キャラクタセットと Unicode

目次

9.1. 一般のキャラクタセットおよび照合順序
9.2. MySQL におけるキャラクタセットおよび照合順序
9.3. デフォルトのキャラクタセットおよび照合順序の決定
9.3.1. サーバのキャラクタセットおよび照合順序
9.3.2. データベースのキャラクタセットおよび照合順序
9.3.3. テーブルのキャラクタセットおよび照合順序
9.3.4. カラムのキャラクタセットおよび照合順序
9.3.5. キャラクタセットと照合順序の割当の例
9.3.6. 接続のキャラクタセットおよび照合順序
9.3.7. 文字列リテラルのキャラクタセットおよび照合順序
9.3.8. SQL クエリの各部分における COLLATE
9.3.9. COLLATE 節の優先順位
9.3.10. BINARY 演算子
9.3.11. 照合順序を決定するのが難しい特殊なケース
9.3.12. 照合順序は適切なキャラクタセットに対応していること
9.3.13. 照合順序がもたらす結果の例
9.4. キャラクタセットのサポートによる影響を受ける演算
9.4.1. 結果文字列
9.4.2. CONVERT()
9.4.3. CAST()
9.4.4. SHOW CHARACTER SET
9.4.5. SHOW COLLATION
9.4.6. SHOW CREATE DATABASE
9.4.7. SHOW FULL COLUMNS
9.5. Unicode のサポート
9.6. メタデータ用の UTF8
9.7. 他の DBMS との互換性
9.8. 新規キャラクタセット設定ファイルの形式
9.9. 各国キャラクタセット
9.10. MySQL 4.0 からのアップグレード
9.10.1. 4.0 キャラクタセットおよび対応する 4.1 キャラクタセット/照合順序のペア
9.11. MySQL でサポートされるキャラクタセットと照合順序
9.11.1. Unicode キャラクタセット
9.11.2. プラットフォーム固有のキャラクタセット
9.11.3. 南ヨーロッパおよび中東のキャラクタセット
9.11.4. アジアのキャラクタセット
9.11.5. バルト語キャラクタセット
9.11.6. キリル語キャラクタセット
9.11.7. 中央ヨーロッパのキャラクタセット
9.11.8. 西ヨーロッパのキャラクタセット

MySQL バージョン 4.1 の追加機能の 1 つとして、キャラクタセットの処理が改善されたことがあげられます。この章では、以下について説明します。

ここでは、MySQL 4.1.1 での実装に基づき機能を説明します (MySQL 4.1.0 には、これらの機能の全部ではなく一部のみが存在します。また、実装が異なっている機能もあります)。

9.1. 一般のキャラクタセットおよび照合順序

キャラクタセットとは、シンボルとエンコードのセットです。照合順序とは、キャラクタセット内の文字を比較するためのルールを集めたものです。架空のキャラクタセットを例にして、キャラクタセットと照合順序の違いを見てみましょう。

次の 4 文字で構成されるアルファベットがあるとします : ‘A’、‘B’、‘a’、‘b’次のように、各文字に対して番号を指定します : ‘A’ = 0、‘B’ = 1、‘a’ = 2、‘c’ = 3文字 ‘A’ はシンボルであり、数字 0 は ‘A’ をエンコードしたものです。4 文字のすべてとそれぞれのエンコードを組み合わせたものをキャラクタセットと呼びます。

次に、文字列値 ‘A’ と ‘B’ を比較してみましょう。 最も簡単に比較するには、エンコードを確認します。‘A’ は 0、‘B’ は 1 です。0 は 1 よりも小さいので、‘A’ は ‘B’ よりも小さいと表現することができます。今ここで行ったのは、キャラクタセットに対する照合順序の適用です。照合順序はルールの集まりであり、上記の場合にルールは ``エンコードの比較'' のみとなります。これは可能な照合順序のうちで最も単純なものであり、バイナリ照合順序と呼ばれています。

しかし、小文字と大文字を等しいと表現したい場合にはどうなるのでしょうか。その場合、少なくとも次の 2 つのルールが必要です。(1) 小文字の ‘a’ および ‘b’ が大文字の ‘A’ および ‘B’ と同じであると見なす。(2) その後にエンコードを比較する。これは大文字と小文字を区別しない照合順序と呼ばれ、バイナリ照合順序よりも少し複雑です。

実際は、大半のキャラクタセットに多数の文字が含まれています。‘A’ と ‘B’ だけではなく、アルファベットの全体から構成されています。ときには複数のアルファベットや、数千文字からなる東洋の書記体系に、多くの特殊記号や終止符が付属することもあります。また、実際には大半の照合順序に多くのルールがあります。大文字と小文字が区別されないだけではありません。アクセントが区別されない(``アクセント'' は、ドイツ語での ‘O’ のように文字に追加されるマーク)、あるいは複数文字マッピング(ドイツ語照合順序のどちらかにおける ‘O’ = 'OE' のルールなど)などのルールがあります。

MySQL 4.1 では以下が可能です。

  • 各種のキャラクタセットを使用して文字列を保存する。

  • 各種の照合順序を使用して文字列を比較する。

  • 同じサーバ、同じデータベース、あるいは同じテーブル内の異なったキャラクタセットまたは照合順序と文字列を結合する。

  • 任意のレベルでキャラクタセットと照合順序を指定できるようにする。

MySQL 4.1 はこれらの点において、MySQL 4.0 よりもはるかに柔軟性があるばかりでなく、他の DBMS に大きく差をつけています。ただし、新機能を効率的に使用するには、利用可能なキャラクタセット、各デフォルトの変更方法、各種の列演算子による処理内容を知っておかなければなりません。

9.2. MySQL におけるキャラクタセットおよび照合順序

キャラクタセットには、少なくとも 1 つの照合順序が含まれており、複数の照合順序が含まれていることもあります。

たとえば、キャラクタセット latin1(``ISO-8859-1 西ヨーロッパ言語'')には以下の照合順序が含まれています。

照合順序意味
latin1_binlatin1 エンコードに基づくバイナリ
latin1_danish_ciデンマーク語/ノルウェー語
latin1_german1_ciドイツ語 DIN-1
latin1_german2_ciドイツ語 DIN-2
latin1_swedish_ciスウェーデン語/フィンランド語
latin1_general_ciマルチリンガル

注意:

  • 2 つの異なったキャラクタセットが同じ照合順序を共有することはできません。

  • 各キャラクタセットには、デフォルト照合順序が 1 つ存在します。たとえば、latin1 のデフォルト照合順序は latin1_swedish_ci です。

照合順序名には次の規則が適用されます。関連するキャラクタセットの名前で始まる。通常は言語名が含まれており、_ci(大文字と小文字が区別されない)、_cs(大文字と小文字が区別される)、_bin(バイナリ)のいずれかで終わる。

9.3. デフォルトのキャラクタセットおよび照合順序の決定

サーバ、データベース、テーブル、接続の 4 段階で、キャラクタセットと照合順序のデフォルト設定が用意されています。以下の説明は複雑に見えるかもしれませんが、マルチレベルのデフォルト設定では自然かつ明確な結果を得られることが実際に判明しています。

9.3.1. サーバのキャラクタセットおよび照合順序

MySQL Server にはサーバキャラクタセットとサーバ照合順序があり、いずれもヌルにすることはできません。

MySQL では、サーバキャラクタセットとサーバ照合順序が次のように決定されます。

  • サーバ起動時に有効なオプション設定に従います。

このレベルでは、決定は簡単です。サーバのキャラクタセットと照合順序は、mysqld の起動時に使用するオプションに依存します。--default-character-set=character_set_name をキャラクタセットに対して使用でき、--default-collation=collation_name を照合順序に対して追加することもできます。文字コードを指定しないのは、--default-character-set=latin1 を指定した場合と同じです。キャラクタセット(たとえば latin1)のみを指定して照合順序を指定しないのは、--default-charset=latin1 --collation=latin1_swedish_ci を指定した場合と同じです。これは latin1 のデフォルト照合順序が latin1_swedish_ci であるためです。 したがって、以下の 3 つのコマンドを実行すると、いずれも同じ結果になります。

shell> mysqld
shell> mysqld --default-character-set=latin1
shell> mysqld --default-character-set=latin1
           --default-collation=latin1_swedish_ci

設定を変更する手段の 1 つは再コンパイルです。ソースからのビルド時にデフォルトのサーバキャラクタセットと照合順序を変更するには、--with-character-set--with-collationconfigure の引数として使用してください。例:

shell> ./configure --with-character-set=latin1

または

shell> ./configure --with-character-set=latin1
           --with-collation=latin1_german1_ci

mysqldconfigure では、キャラクタセットと照合順序の有効性がチェックされます。組み合わせが有効でない場合、各プログラムによってエラーメッセージが表示され、強制終了されます。

9.3.2. データベースのキャラクタセットおよび照合順序

各データベースにはデータベースキャラクタセットとデータベース照合順序があり、いずれもヌルにすることはできません。CREATE DATABASE および ALTER DATABASE コマンドには現在、データベースのキャラクタセットと照合順序を指定するためのオプション節があります。

CREATE DATABASE db_name
   [DEFAULT CHARACTER SET character_set_name [COLLATE collation_name]]

ALTER DATABASE db_name
    [DEFAULT CHARACTER SET character_set_name [COLLATE collation_name]]

例:

CREATE DATABASE db_name
   DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci;

MySQL では、データベースキャラクタセットとデータベース照合順序が次のように選択されます。

  • CHARACTER SET XCOLLATE Y の両方を指定した場合は、キャラクタセット X と照合順序 Y

  • CHARACTER SET X を指定し、COLLATE を指定しなかった場合は、キャラクタセット X とそのデフォルト照合順序。

  • その他の場合は、サーバキャラクタセットとサーバ照合順序。

MySQL の CREATE DATABASE ... DEFAULT CHARACTER SET ... 構文は標準 SQL CREATE SCHEMA ... CHARACTER SET ... 構文に類似しています。このため、キャラクタセットと照合順序が異なる複数のデータベースを同一の MySQL サーバ上に作成することができます。

テーブルのキャラクタセットと照合順序が CREATE TABLE ステートメントに指定されていない場合、データベースのキャラクタセットと照合順序はデフォルト値として使用されます。これらに他の用途はありません。

9.3.3. テーブルのキャラクタセットおよび照合順序

各テーブルにはテーブルキャラクタセットとテーブル照合順序があり、いずれもヌルにすることはできません。CREATE TABLE および ALTER TABLE ステートメントには現在、テーブルのキャラクタセットと照合順序を指定するためのオプション節があります。

CREATE TABLE table_name ( column_list )
   [DEFAULT CHARACTER SET character_set_name [COLLATE collation_name]]

ALTER TABLE table_name
   [DEFAULT CHARACTER SET character_set_name] [COLLATE collation_name]

例:

CREATE TABLE t1 ( ... ) DEFAULT CHARACTER SET latin1 COLLATE latin1_danish_ci;

MySQL では、テーブルキャラクタセットとテーブル照合順序が次のように選択されます。

  • CHARACTER SET XCOLLATE Y の両方を指定した場合は、キャラクタセット X と照合順序 Y

  • CHARACTER SET X を指定し、COLLATE を指定しなかった場合は、キャラクタセット X とそのデフォルト照合順序。

  • その他の場合は、データベースキャラクタセットとデータベース照合順序。

カラムのキャラクタセットと照合順序が個別のカラム定義に指定されていない場合、テーブルのキャラクタセットと照合順序はデフォルト値として使用されます。テーブルのキャラクタセットと照合順序は MySQL 拡張であり、同等の機能は標準 SQL に存在しません。

9.3.4. カラムのキャラクタセットおよび照合順序

各 ``文字'' カラム(CHARVARCHAR または TEXT型)にはカラムキャラクタセットとカラム照合順序があり、いずれもヌルにすることはできません。カラム定義構文には現在、カラムキャラクタセットとカラム照合順序を指定するためのオプション節があります。

column_name {CHAR | VARCHAR | TEXT} (column_length)
    [CHARACTER SET character_set_name [COLLATE collation_name]]

例:

CREATE TABLE Table1
(
   column1 VARCHAR(5) CHARACTER SET latin1 COLLATE latin1_german1_ci
);

MySQL では、カラムキャラクタセットとカラム照合順序が次のように選択されます。

  • CHARACTER SET XCOLLATE Y の両方を指定した場合は、キャラクタセット X と照合順序 Y

  • CHARACTER SET X を指定し、COLLATE を指定しなかった場合は、キャラクタセット X とそのデフォルト照合順序。

  • その他の場合は、テーブルキャラクタセットとテーブル照合順序。

CHARACTER SET および COLLATE 節は標準 SQL です。

9.3.5. キャラクタセットと照合順序の割当の例

MySQL でデフォルトのキャラクタセットと照合順序の値がどのように決定されるかを、以下の例で示します。

例 1:テーブル + カラム定義

CREATE TABLE t1
(
  c1 CHAR(10) CHARACTER SET latin1 COLLATE latin1_german1_ci
) DEFAULT CHARACTER SET latin2 COLLATE latin2_bin;

ここでは、latin1 キャラクタセットと latin1_german1_ci 照合順序がカラムに指定されています。定義は明示的なので、直接的と言えます。なお、latin1 カラムの保存先が latin2 テーブルになっていることに問題はありません。

例 2:テーブル + カラム定義

CREATE TABLE t1
(
   c1 CHAR(10) CHARACTER SET latin1
) DEFAULT CHARACTER SET latin1 COLLATE latin1_danish_ci;

ここでは、latin1 キャラクタセットとデフォルト照合順序がカラムに指定されています。自然な指定に見えますが、デフォルト照合順序はテーブルレベルから取り込まれません。latin1 のデフォルト照合順序は常に latin1_swedish_ci です。したがって、カラム c1 には latin1_danish_ci の照合順序ではなく latin1_swedish_ci の照合順序が設定されます。

例 3:テーブル + カラム定義

CREATE TABLE t1
(
   c1 CHAR(10)
) DEFAULT CHARACTER SET latin1 COLLATE latin1_danish_ci;

ここでは、デフォルトキャラクタセットとデフォルト照合順序がカラムに指定されています。この場合に MySQL では、テーブルレベルまで検索してカラムのキャラクタセットと照合順序が決定されます。したがって、カラム c1 のキャラクタセットは latin1、照合順序は latin1_danish_ci となります。

例 4:データベース + テーブル + カラム定義

CREATE DATABASE d1 DEFAULT CHARACTER SET latin2 COLLATE latin2_czech_ci;
USE d1;
CREATE TABLE t1
(
   c1 CHAR(10)
);

キャラクタセットと照合順序を指定せずにカラムを作成します。テーブルレベルのキャラクタセットと照合順序も指定しません。この場合に MySQL では、データベースレベルまでさかのぼって処理が決定されます。(データベースの設定はテーブルの設定になり、そしてカラムの設定になります。)したがって、カラム c1 のキャラクタセットは latin2、照合順序は latin2_czech_ci となります。

9.3.6. 接続のキャラクタセットおよび照合順序

各接続には接続キャラクタセットと接続照合順序があり、いずれもヌルにすることはできません。実際には 2 つの接続キャラクタセットが存在するため、両者の区別が必要な場合は ``接続/リテラル'' および ``接続/結果'' の呼称を使い分けています。

``接続'' とは、サーバへの接続時に作成されるものです。クライアントは接続を介し、SQL ステートメント(クエリなど)をサーバに送信します。サーバでは接続を介し、応答(結果セットなど)をクライアントに返します。これによって、次のような疑問が生じます。(a) クライアントから送信される際にどのキャラクタセットでクエリが送られるのか。(b) サーバではクエリを受信した後にどのキャラクタセットに変換するのか。(c) サーバでは結果セットまたはエラーメッセージをクライアントに返送する前にどのキャラクタセットに変換するのか。これらは細かく調整することができますが、デフォルトを適用することもできます。デフォルトを適用する場合、このセクションをとばしてかまいません。

接続キャラクタセットに影響するステートメントが 2 つ存在します。

SET NAMES character_set_name
SET CHARACTER SET character_set_name

SET NAMES は、クライアントから送信される SQL ステートメントのキャラクタセットを示します。たとえば、SET NAMES cp1251 は 「このクライアントからの入力メッセージは今後、キャラクタセット cp1251 になります」 とサーバに通知します。サーバでは適宜、独自のキャラクタセットへと自由に変換することができます。

SET CHARACTER SET は、クライアントから送信される SQL ステートメントのキャラクタセットと、サーバからクライアントに返される結果セットのキャラクタセットを示します。そのため SET CHARACTER SET は、SET NAMES を含んでいるほか、たとえば SELECT ステートメントを使用する際にどのキャラクタセットでカラムに値が保持されるかを示します。

例:column1CHAR(5) CHARACTER SET latin2 として定義されているとします。SET CHARACTER SET が指定されていない場合、SELECT column1 FROM t に対しサーバは、キャラクタセット latin2 を使用して column1 の値をすべて返します。一方、SET CHARACTER SET latin1 が指定されている場合、サーバは送信前に latin2 の値を latin1 に変換します。そのような変換は低速であり、損失につながることもあります。

SET NAMES または SET CHARACTER SET の実行時には、``接続照合順序'' も変更していることになります。ただし、接続照合順序は整合性の維持のみを目的として存在しています。通常、その値は重要ではありません。

mysql クライアントでは、起動するたびに SET NAMES を実行する必要はありません。--default-character-set-name オプション設定を mysql のコマンドラインか、オプションファイルに追加することができます。 たとえば、以下のオプション設定ファイルの設定では、mysql を実行するたびに接続キャラクタセットが指定されます。

[mysql]
default-character-set-name=character_set_name

9.3.7. 文字列リテラルのキャラクタセットおよび照合順序

各文字列リテラルにはキャラクタセットと照合順序があり、いずれもヌルにすることはできません。

文字列リテラルでは、オプションとしてキャラクタセットイントロデューサと COLLATE 節を指定することができます。

[_character_set_name]'string' [COLLATE collation_name]

例:

SELECT 'string';
SELECT _latin1'string';
SELECT _latin1'string' COLLATE latin1_danish_ci;

単純なステートメント SELECT 'string' では、接続/リテラルキャラクタセットが使用されます。

_character_set_name は以前、イントロデューサと呼ばれていました。指定すると、``キャラクタセット X の文字列が後続する'' ことがパーサに通知されます。 上記はユーザの混乱を招いていたため、ここで強調しておきますが、イントロデューサは変換の原因にはならず、文字列の値が変更されないことを示すにすぎません。標準的な 16 進リテラルおよび数値 16 進リテラルの表記(x'literal' および 0xnnnn)の前と ?(用意されたステートメントをプログラミング言語インタフェースで使用する際のパラメータ代替)の前でも、イントロデューサは有効です。

例:

SELECT _latin1 x'AABBCC';
SELECT _latin1 0xAABBCC;
SELECT _latin1 ?;

MySQL では、リテラルのキャラクタセットおよび照合順序が次のように決定されます。

  • _XCOLLATE Y の両方が指定された場合、リテラルキャラクタセットは X、リテラル照合順序は Y

  • _X は指定されており、COLLATE が指定されていない場合、リテラルキャラクタセットは X、リテラル照合順序は Xのデフォルト照合順序。

  • その他の場合は、接続/リテラルのキャラクタセットおよび照合順序。

例:

  • 文字列に latin1 キャラクタセットと latin1_german1_ci 照合順序が指定されている場合

    SELECT _latin1'Muller' COLLATE latin1_german1_ci;
    
  • 文字列に latin1 キャラクタセットとそのデフォルト照合順序(latin1_swedish_ci)が指定されている場合

    SELECT _latin1'Muller';
    
  • 文字列に接続/リテラルのキャラクタセットおよび照合順序が指定されている場合

    SELECT 'Muller';
    

キャラクタセットイントロデューサと COLLATE 節は、標準 SQL の指定に基づき実装されます。

9.3.8. SQL クエリの各部分における COLLATE

COLLATE 節では、比較に対するデフォルト照合順序が何であれ、無効にすることができます。SQL クエリのさまざまな個所で COLLATE を使用することができます。以下に例を示します。

  • ORDER BY を指定した場合

    SELECT k
    FROM t1
    ORDER BY k COLLATE latin1_german2_ci;
    
  • AS を指定した場合

    SELECT k COLLATE latin1_german2_ci AS k1
    FROM t1
    ORDER BY k1;
    
  • GROUP BY を指定した場合

    SELECT k
    FROM t1
    GROUP BY k COLLATE latin1_german2_ci;
    
  • 集計関数を指定した場合

    SELECT MAX(k COLLATE latin1_german2_ci)
    FROM t1;
    
  • DISTINCT を指定した場合

    SELECT DISTINCT k COLLATE latin1_german2_ci
    FROM t1;
    
  • WHERE を指定した場合

    SELECT *
    FROM t1
    WHERE _latin1 'Muller' COLLATE latin1_german2_ci = k;
    
  • HAVING を指定した場合

    SELECT k
    FROM t1
    GROUP BY k
    HAVING k = _latin1 'Muller' COLLATE latin1_german2_ci;
    

9.3.9. COLLATE 節の優先順位

COLLATE 節は優先順位が高い(|| よりも上)ので、式

x || y COLLATE z

は以下と同じ意味になります。

x || (y COLLATE z)

9.3.10. BINARY 演算子

BINARY 演算子は、COLLATE 節の省略形です。たとえば、BINARY 'x''x' COLLATE y と同じであり、この場合に y は該当するバイナリ照合順序の名称を表します。たとえば、カラム a のキャラクタセットが latin1 であると仮定すると、以下のクエリはどちらも同じ結果をもたらします。

SELECT * FROM t1 ORDER BY BINARY a;
SELECT * FROM t1 ORDER BY a COLLATE latin1_bin;

注意:どのキャラクタセットにもバイナリ照合順序があります。

9.3.11. 照合順序を決定するのが難しい特殊なケース

大多数のクエリでは、MySQL がどの照合順序により比較演算を行うかは明確になっています。たとえば以下の場合、照合順序が ``カラム x のカラム照合順序'' になることは明らかです。

SELECT x FROM T ORDER BY x;
SELECT x FROM T WHERE x = x;
SELECT DISTINCT x FROM T;

ただし、複数のオペランドが使用されていると、あいまいになることがあります。たとえば、以下のような場合です。

SELECT x FROM T WHERE x = 'Y';

x の照合順序と文字列リテラル 'Y' の照合順序のどちらがこのクエリで使用されるのでしょうか。

標準 SQL では、``強制可能'' ルールと呼ばれていた方法で上記の問題を解決しました。これについては、以下の発想が基本となっています: x'Y' の両方に照合順序があるので、どちらの照合順序を優先するかを判断しなければならない。複雑な問題だが、これらのルールでほとんどの状況に対応できる。

  • 明示的な COLLATE 節は優先順位が 4。

  • 照合順序の異なる文字列 2 つの連結は優先順位が 3。

  • カラムの照合順序は優先順位が 2。

  • リテラルの照合順序は優先順位が 1。

これらのルールによって、あいまいさは次のように解消されます。

  • 優先順位が最も高い照合順序を使用する。

  • 双方の優先順位が一致する場合、照合順序が一致しないとエラーとなる。

例:

column1 = 'A'column1 の照合順序を使用する。
column1 = 'A' COLLATE x'A' の照合順序を使用する。
column1 COLLATE x = 'A' COLLATE yエラー

9.3.12. 照合順序は適切なキャラクタセットに対応していること

各キャラクタセットには 1 つ以上の照合順序があり、各照合順序は 1 つのキャラクタセットに関連付けられていることを思い出してください。したがって、次のステートメントはエラーになります。latin2_bin 照合順序は latin1 キャラクタセットに対して有効でないからです。

mysql> SELECT _latin1 'x' COLLATE latin2_bin;
ERROR 1251: COLLATION 'latin2_bin' is not valid
for CHARACTER SET 'latin1'

9.3.13. 照合順序がもたらす結果の例

テーブル T のカラム X に以下の latin1 カラムの値が設定されているとします。

Muffler
Muller
MX Systems
MySQL

さらに、以下のステートメントを使用してカラムの値を取得したとします。

SELECT X FROM T ORDER BY X COLLATE collation_name;

異なった照合順序に対する値の順序は以下のようになります。

latin1_swedish_cilatin1_german1_cilatin1_german2_ci
MufflerMufflerMuller
MX SystemsMullerMuffler
MullerMX SystemsMX Systems
MySQLMySQLMySQL

この表は、複数の異なった照合順序を ORDER BY 節で使用した結果の一例です。この例では、2 個の点が上に付いている U が問題の原因です。この文字をドイツではウムラウトと呼んでいますが、私たちは分音記号付きの U と呼んでいます。

最初のカラムには、スウェーデン語/フィンランド語の照合ルールを使用したSELECT の結果が示されています。この照合ルールによると、分音記号付きの U は Y と一致します。

2 番目のカラムには、ドイツ語の DIN-1 ルールを使用した SELECT の結果が示されています。このルールによると、分音記号付きの U は U と一致します。

3 番目のカラムには、ドイツ語の DIN-2 ルールを使用したSELECT の結果が示されています。このルールによると、分音記号付きの U は UE と一致します。

3 つの異なった照合順序が、3 つの異なった結果をもたらしています。これこそ正に MySQL で対処すべき状況です。適切な照合順序を使用すると、任意のソート順序を選択できます。

9.4. キャラクタセットのサポートによる影響を受ける演算

このセクションでは、キャラクタセット情報を計算に入れる演算について説明します。

9.4.1. 結果文字列

MySQL には、文字列を返す多数の演算子と関数があります。 このセクションでは、そのような文字列のキャラクタセットと照合順序について解説しています。

文字列の入力を取得して文字列の結果を出力として返す単純な関数では、出力のキャラクタセットおよび照合順序は主要な入力のキャラクタセットおよび照合順序と同じです。たとえば UPPER(X) は、キャラクタセットおよび照合が X と一致する文字列を返します。 同じことは以下についても当てはまります。 INSTR(), LCASE(), LOWER(), LTRIM(), MID(), REPEAT(), REPLACE(), REVERSE(), RIGHT(), RPAD(), RTRIM(), SOUNDEX(), SUBSTRING(), TRIM(), UCASE(), UPPER()。 (注意: REPLACE() 関数は他のすべての関数とは異なり、文字列入力の照合順序を無視し、大文字と小文字が区別されない比較を毎回実行します。)

複数の文字列入力を組み合わせて単一の文字列出力を返す操作には、SQL-99 の ``集約ルール'' が適用されます(以下を参照)。

  • 明示的な COLLATE X が存在する場合は X を使用する。

  • 明示的な COLLATE XCOLLATE Y が存在する場合はエラーになる。

  • 上記以外の場合ですべての照合順序が X であるときは X を使用する。

  • その他の場合、結果に照合順序は含まれない。

たとえば、CASE ... WHEN a THEN b WHEN b THEN c COLLATE X END と指定されている場合、照合順序は X になります。同じことは以下についても当てはまります。 CONCAT(), GREATEST(), IF(), LEAST(), CASE, UNION, ||, ELT()

文字データに変換する操作のため、結果文字列のキャラクタセットと照合順序は 接続/リテラルキャラクタセットに含まれており、接続/リテラル照合順序を持っています。 このことは以下についても当てはまります。 CHAR(), CAST(), CONV(), FORMAT()HEX(), SPACE()

9.4.2. CONVERT()

CONVERT() を使用すると、異なるキャラクタセット間でデータを変換することができます。構文は以下のとおりです。

CONVERT(expr USING transcoding_name)

MySQL では、トランスコーディング名は対応するキャラクタセット名と同じです。

例:

SELECT CONVERT(_latin1'Muller' USING utf8);
INSERT INTO utf8table (utf8column)
   SELECT CONVERT(latin1field USING utf8) FROM latin1table;

CONVERT(... USING ...) は、SQL-99 の仕様に基づき実装されています。

9.4.3. CAST()

CAST() を使用し、文字列を別のキャラクタセットに変換することもできます。新しい書式は以下のとおりです。

CAST ( character_string AS character_data_type
    CHARACTER SET character_set_name )

例:

SELECT CAST(_latin1'test' AS CHAR CHARACTER SET utf8);

COLLATE 節を CAST() の内部で使用することはできませんが、外部では使用することができます。したがって、CAST(... COLLATE ...) は無効ですが、CAST(...) COLLATE ... は有効です。

例:

SELECT CAST(_latin1'test' AS CHAR CHARACTER SET utf8) COLLATE utf8_bin;

CAST()CHARACTER SET の指定なしで使用した場合、キャラクタセットと照合順序は接続/リテラルキャラクタセットとそのデフォルト照合順序になります。CAST()CHARACTER SET X の指定ありで使用した場合、キャラクタセットは X、照合順序は X のデフォルト照合順序になります。

9.4.4. SHOW CHARACTER SET

SHOW CHARACTER SET コマンドを実行すると、使用可能なキャラクタセットがすべて表示されます。 オプション節 LIKE を指定すると、条件にマッチするキャラクタセットを表示することができます。

例:

mysql> SHOW CHARACTER SET LIKE 'latin%';
+---------+-----------------------------+-------------------+--------+
| Charset | Description                 | Default collation | Maxlen |
+---------+-----------------------------+-------------------+--------+
| latin1  | ISO 8859-1 West European    | latin1_swedish_ci |      1 |
| latin2  | ISO 8859-2 Central European | latin2_general_ci |      1 |
| latin5  | ISO 8859-9 Turkish          | latin5_turkish_ci |      1 |
| latin7  | ISO 8859-13 Baltic          | latin7_general_ci |      1 |
+---------+-----------------------------+-------------------+--------+
4 rows in set (0.00 sec)

上の一覧に関する注意:

  • Maxlen カラムは、1 文字を格納するための最大バイト数を示します。

9.4.5. SHOW COLLATION

SHOW COLLATION コマンドを実行すると、使用可能なキャラクタセットがすべて表示されます。 オプション節 LIKE を指定すると、条件にマッチする照合順序名が表示されます。

mysql> SHOW COLLATION LIKE 'latin1%';
+-------------------+---------+----+---------+----------+---------+
| Collation         | Charset | Id | Default | Compiled | Sortlen |
+-------------------+---------+----+---------+----------+---------+
| latin1_german1_ci | latin1  |  5 |         |          |       0 |
| latin1_swedish_ci | latin1  |  8 | Yes     | Yes      |       0 |
| latin1_danish_ci  | latin1  | 15 |         |          |       0 |
| latin1_german2_ci | latin1  | 31 |         | Yes      |       2 |
| latin1_bin        | latin1  | 47 |         | Yes      |       0 |
| latin1_general_ci | latin1  | 48 |         |          |       0 |
| latin1_general_cs | latin1  | 49 |         |          |       0 |
+-------------------+---------+----+---------+----------+---------+
7 rows in set (0.00 sec)

Default カラムは、照合順序がそのキャラクタセットのデフォルトであるかどうかを示します。 Compiled は、キャラクタセットがサーバにコンパイルされているかどうかを示します。 Sortlen は、キャラクタセットでソート文字列を表現するために必要なメモリの容量に関連します。

9.4.6. SHOW CREATE DATABASE

以下のクエリは、指定されたデータベースを作成する CREATE DATABASE ステートメントを示します。実行結果には、データベースオプションがすべて含まれています。DEFAULT CHARACTER SETCOLLATE がサポートされています。データベースオプションがすべて保存されている単一のテキストファイルがデータベースディレクトリにあります。

mysql> SHOW CREATE DATABASE a;
+----------+-----------------------------------------------------------+
| Database | Create Database
|
+----------+-----------------------------------------------------------+
| a        | CREATE DATABASE `a` /*!40100 DEFAULT CHARACTER SET macce
COLLATE macce_ci_ai */ |
+----------+-----------------------------------------------------------+
1 row in set (0.00 sec)

9.4.7. SHOW FULL COLUMNS

SHOW COLUMNS ステートメントを SHOW FULL COLUMNS として呼び出したときは、テーブルのカラムの照合順序を示します。 データ型が CHARVARCHARTEXT のいずれかであるカラムは、照合順序が NULL になっていません。数値型と文字型以外のカラムは、照合順序が NULL になっています。例:

mysql> SHOW FULL COLUMNS FROM a;
+-------+---------+-------------------+------+-----+---------+-------+
| Field | Type    | Collation         | Null | Key | Default | Extra |
+-------+---------+-------------------+------+-----+---------+-------+
| a     | char(1) | latin1_swedish_ci | YES  |     | NULL    |       |
| b     | int(11) | NULL              | YES  |     | NULL    |       |
+-------+---------+-------------------+------+-----+---------+-------+
2 rows in set (0.02 sec)

キャラクタセットは表示対象に含まれていません。

9.5. Unicode のサポート

MySQL バージョン 4.1 以降、Unicode データを保存するために次の新しいキャラクタセットが用意されています: ucs2 (UCS-2 Unicode キャラクタセット)および utf8 (Unicode キャラクタセットの UTF-8 エンコード)。

  • UCS-2(Unicode のバイナリ表現)では、各文字は 2 バイトの Unicode と最上位のバイトで最初に表現されます。例 : "ラテン文字の大文字 A" はコード 0x0041 ですが、2 バイトシーケンス 0x00 0x41 として保存されています。"キリル文字の小文字 YERU"(Unicode 0x044B)は2 バイトシーケンス 0x04 0x4B として保存されています。Unicode 文字および対応するコードについては、Unicode Home Page を参照してください。

    一時的な制限:UCS-2 はクライアントキャラクタセットとしては(まだ)使用できません。つまり、SET NAMES ucs2 は有効ではないということです。

  • UTF8 キャラクタセット(Unicode 表現の変換)は、Unicode データを保存する別の方法であり、RFC2279 に基づき実装されています。さまざまな Unicode 文字を長さの異なるバイトシーケンスに適合させることが、UTF8 キャラクタセットの概念です。

    • 基本的なラテン文字、数字、句読点は 1 バイトを使用します。

    • ヨーロッパおよび中東のスクリプト文字の多くは、2 バイトシーケンスに適合します。拡張ラテン文字(チルダ、長音、鋭アクセント、抑音アクセントその他のアクセント付き)、キリル文字、ギリシア文字、アルメニア文字、ヘブライ文字、アラビア文字、シリア文字その他。

    • 韓国語、中国語、日本語の表意文字は、3 バイトシーケンスを使用します。

    • 現時点では、MySQL UTF8 サポートに 4 バイトシーケンスは含まれていません。

    ヒント:スペースを UTF8 で保存するには、CHAR ではなく VARCHAR を使用してください。 そのようにしないと、MySQL では CHAR(10) CHARACTER SET utf8 カラムに対して 30 バイトを確保しなければなりません。これは、使用可能な最大長が 30 バイトであるためです。

9.6. メタデータ用の UTF8

メタデータとは、データについてのデータです。データベースの内容となっているデータではなく、データベースについて説明するデータがメタデータです。したがって、カラム名、データベース名、ユーザ名、バージョン名のほか、SHOW を実行して表示される文字列の多くがメタデータに該当します。

すべてのメタデータはキャラクタセットが一致している必要があります(そうなっていない場合、SHOW は正しく実行されるとは限りません。同じカラムに含まれる個々のレコードのキャラクタセットが一致しない可能性があるからです)。一方、すべての言語によるすべての文字がメタデータに含まれている必要があります(そうなっていない場合、ユーザがカラムやテーブルの名称を母国語で設定できない可能性があります)。上記 2 つの目的を考慮するため、MySQL ではメタデータが Unicode キャラクタセット(UTF8)で保存されます。これによって不具合が発生しないのは、アクセント付き文字を使用しない場合です。使用する場合、メタデータのキャラクタセットが UTF8 であることを認識する必要があります。

つまり、USER()(およびそのシノニム SESSION_USER()SYSTEM_USER())、CURRENT_USER()VERSION() の各関数では、UTF8 キャラクタセットがデフォルトで使用されます。

ただし、カラムのヘッダと DESCRIBE 関数の実行結果がデフォルトで UTF8 キャラクタセットになるということではありません (SELECT column1 FROM t と指定すると、名称 column1 自体がクライアントのキャラクタセットによりサーバからクライアントに返されます。このキャラクタセットは、SET NAMES ステートメントで決定されたものです)。

サーバからメタデータの結果が UTF8 以外のキャラクタセットで返されるようにするには、(see 項9.3.6. 「接続のキャラクタセットおよび照合順序」)の変換を SET CHARACTER SET によってサーバに実行させるか、変換がクライアントで実行されるように設定します。クライアントに変換を実行させる方が常に効率的ですが、このオプションは MySQL 4.x の製品サイクル後期まで使用することができません。

たとえば、USER() 関数を比較または割当のために単一のステートメントで使用しているとします。 MySQL には自動変換機能が用意されています。

SELECT * FROM Table1 WHERE USER() = latin1_column;

この機能が有効なのは、latin1_column の内容が UTF8 へと自動的に変換されてから比較が行われるからです。

INSERT INTO Table1 (latin1_column) SELECT USER();

この機能が有効なのは、USER() の内容が latin1 へと自動的に変換されてから割当が行われるからです。 自動変換機能は完全には実装されていませんが、将来のバージョンでは適切に動作する予定です。

自動変換機能は SQL 標準に含まれていません。ただし、どのキャラクタセットも(サポートされている文字に関して)Unicode の ``サブセット'' であることが SQL 標準の文書に記載されています。「スーパーセットに適用されるものはサブセットにも適用される」という有名な原則があるので、Unicode の照合順序は Unicode 以外の文字列との比較にも適用できると考えられます。

バージョン 4.1.1 注意:この時点から、errmsg.txt ファイルはすべて UTF8 になります。クライアントのキャラクタセットへの変換は、メタデータに関しては自動的に行われます。結果セットを返す場合のデフォルトの動作を変更することができます。

9.7. 他の DBMS との互換性

SAP DB の互換性に関し、以下の 2 つのステートメントは同じです。

CREATE TABLE t1 (f1 CHAR(n) UNICODE);
CREATE TABLE t1 (f1 CHAR(n) CHARACTER SET ucs2);

9.8. 新規キャラクタセット設定ファイルの形式

MySQL 4.1 の場合、キャラクタセットの設定は XML ファイルに保存されます。キャラクタセットごとに 1 ファイルが使用されます(以前のバージョンでは、キャラクタセット設定情報は .conf ファイルに保存されました)。

9.9. 各国キャラクタセット

MySQL-4.x とそれ以前のバージョンでは、NCHARCHAR は同義語でした。ANSI では、事前定義キャラクタセットが CHAR カラムで使用されるように指定する方法の 1 つとして NCHAR または NATIONAL CHAR を定義しています。MySQL では、utf8 が事前定義キャラクタセットとして使用されます。たとえば、以下のカラム型宣言

CHAR(10) CHARACTER SET utf8
NATIONAL CHARACTER(10)
NCHAR(10)

は、以下のカラム型宣言と等価です。

VARCHAR(10) CHARACTER SET utf8
NATIONAL VARCHAR(10)
NCHAR VARCHAR(10)
NATIONAL CHARACTER VARYING(10)
NATIONAL CHAR VARYING(10)

N'literal' を使用して、各国キャラクタセットの文字列を作成することができます。

以下の 2 つのステートメントは等価です。

SELECT N'some text';
SELECT _utf8'some text';

9.10. MySQL 4.0 からのアップグレード

ここでは、旧バージョンの MySQL からのアップグレードについて説明します。MySQL 4.1 では、MySQL 4.0 との上位互換性がほぼ完全に確保されており、その理由は単に機能の大半が新しい点にあります。したがって、コンフリクトを引き起こす要素は旧バージョンに存在しません。ただし、相違点と注意点がいくつかあります。

最重要:``MySQL 4.0 キャラクタセット'' には、``MySQL 4.1 キャラクタセット'' と ``MySQL 4.1 照合順序'' の両方の特性が含まれています。しかし、これを覚えておく必要はありません。今後は、同じ複合オブジェクト内でキャラクタセットまたは照合順序特性を並存させない予定です。

MySQL には各国キャラクタセットに関する特別な処理が用意されています。 4.1. NCHARCHAR と同じではなく、N'...' リテラルは '...' リテラルと同じではありません。

最後に、キャラクタセットと照合順序に関する情報を格納するための特別なファイル形式があります。新規設定ファイルを含む /share/mysql/charsets/ ディレクトリの再インストールが済んでいることを確認してください。

MySQL 4.0 で作成したデータを使用し、mysqld を 4.1.x ディストリビューションから起動するには、同じキャラクタセットと照合順序でサーバを起動する必要があります。この場合、データのインデックスを再作成する必要はありません。

上記を実行する方法は以下の 2 とおりです。

shell> ./configure --with-character-set=... --with-collation=...
shell> ./mysqld --default-character-set=... --default-collation=...

たとえば、mysql を MySQL 4.0 danish キャラクタセットと共に使用する場合、latin1 キャラクタセットと latin1_danish_ci 照合順序を使用する必要があります。

shell> ./configure --with-character-set=latin1
           --with-collation=latin1_danish_ci
shell> ./mysqld --default-character-set=latin1
           --default-collation=latin1_danish_ci

次のセクションに示された表を使用し、古い 4.0 キャラクタセット名とそれに対応する 4.1 キャラクタセット/照合順序のペアを検索します。

9.10.1. 4.0 キャラクタセットおよび対応する 4.1 キャラクタセット/照合順序のペア

ID4.0 キャラクタセット4.1 キャラクタセット4.1 照合順序
1big5big5big5_chinese_ci
2czechlatin2latin2_czech_ci
3dec8dec8dec8_swedish_ci
4doscp850cp850_general_ci
5german1latin1latin1_german1_ci
6hp8hp8hp8_english_ci
7koi8_rukoi8rkoi8r_general_ci
8latin1latin1latin1_swedish_ci
9latin2latin2latin2_general_ci
10swe7swe7swe7_swedish_ci
11usa7asciiascii_general_ci
12ujisujisujis_japanese_ci
13sjissjissjis_japanese_ci
14cp1251cp1251cp1251_bulgarian_ci
15danishlatin1latin1_danish_ci
16hebrewhebrewhebrew_general_ci
17win1251(removed)(removed)
18tis620tis620tis620_thai_ci
19euc_kreuckreuckr_korean_ci
20estonialatin7latin7_estonian_ci
21hungarianlatin2latin2_hungarian_ci
22koi8_ukrkoi8ukoi8u_ukrainian_ci
23win1251ukrcp1251cp1251_ukrainian_ci
24gb2312gb2312gb2312_chinese_ci
25greekgreekgreek_general_ci
26win1250cp1250cp1250_general_ci
27croatlatin2latin2_croatian_ci
28gbkgbkgbk_chinese_ci
29cp1257cp1257cp1257_lithuanian_ci
30latin5latin5latin5_turkish_ci
31latin1_delatin1latin1_german2_ci

9.11. MySQL でサポートされるキャラクタセットと照合順序

MySQL でサポートされるキャラクタセットと照合順序の注釈付き一覧を以下に示します。オプションとインストール時の設定が異なるため、一覧に含まれている項目の一部が表示されないサーバもあります。また、新しいキャラクタセットまたは照合順序の定義は簡単なので、一覧に含まれていない項目が表示されるサーバもあります。

MySQL では、30 を超えるキャラクタセットに対して 70 を超える照合順序がサポートされています。

mysql> SHOW CHARACTER SET;
+----------+-----------------------------+---------------------+--------+
| Charset  | Description                 | Default collation   | Maxlen |
+----------+-----------------------------+---------------------+--------+
| big5     | Big5 Traditional Chinese    | big5_chinese_ci     |      2 |
| dec8     | DEC West European           | dec8_swedish_ci     |      1 |
| cp850    | DOS West European           | cp850_general_ci    |      1 |
| hp8      | HP West European            | hp8_english_ci      |      1 |
| koi8r    | KOI8-R Relcom Russian       | koi8r_general_ci    |      1 |
| latin1   | ISO 8859-1 West European    | latin1_swedish_ci   |      1 |
| latin2   | ISO 8859-2 Central European | latin2_general_ci   |      1 |
| swe7     | 7bit Swedish                | swe7_swedish_ci     |      1 |
| ascii    | US ASCII                    | ascii_general_ci    |      1 |
| ujis     | EUC-JP Japanese             | ujis_japanese_ci    |      3 |
| sjis     | Shift-JIS Japanese          | sjis_japanese_ci    |      2 |
| cp1251   | Windows Cyrillic            | cp1251_bulgarian_ci |      1 |
| hebrew   | ISO 8859-8 Hebrew           | hebrew_general_ci   |      1 |
| tis620   | TIS620 Thai                 | tis620_thai_ci      |      1 |
| euckr    | EUC-KR Korean               | euckr_korean_ci     |      2 |
| koi8u    | KOI8-U Ukrainian            | koi8u_general_ci    |      1 |
| gb2312   | GB2312 Simplified Chinese   | gb2312_chinese_ci   |      2 |
| greek    | ISO 8859-7 Greek            | greek_general_ci    |      1 |
| cp1250   | Windows Central European    | cp1250_general_ci   |      1 |
| gbk      | GBK Simplified Chinese      | gbk_chinese_ci      |      2 |
| latin5   | ISO 8859-9 Turkish          | latin5_turkish_ci   |      1 |
| armscii8 | ARMSCII-8 Armenian          | armscii8_general_ci |      1 |
| utf8     | UTF-8 Unicode               | utf8_general_ci     |      3 |
| ucs2     | UCS-2 Unicode               | ucs2_general_ci     |      2 |
| cp866    | DOS Russian                 | cp866_general_ci    |      1 |
| keybcs2  | DOS Kamenicky Czech-Slovak  | keybcs2_general_ci  |      1 |
| macce    | Mac Central European        | macce_general_ci    |      1 |
| macroman | Mac West European           | macroman_general_ci |      1 |
| cp852    | DOS Central European        | cp852_general_ci    |      1 |
| latin7   | ISO 8859-13 Baltic          | latin7_general_ci   |      1 |
| cp1256   | Windows Arabic              | cp1256_general_ci   |      1 |
| cp1257   | Windows Baltic              | cp1257_general_ci   |      1 |
| binary   | Binary pseudo charset       | binary              |      1 |
+----------+-----------------------------+---------------------+--------+
33 rows in set (0.01 sec)

注意:すべてのキャラクタセットにバイナリ照合順序が存在します。ただし、以降の説明ではバイナリ照合順序について取り上げていないこともあります。

9.11.1. Unicode キャラクタセット

Unicode キャラクタセットが 2 つ存在することは言うまでもありません。これらのキャラクタセットを使用し、約 650 の言語でテキストを保存することができます。2 つの新しいキャラクタセットに対応する多くの照合順序は追加されていませんが、間もなく追加される予定です。現在、大文字と小文字およびアクセントが区別されないデフォルトの照合順序のほか、バイナリ照合順序があります。

+---------+-----------------+-------------------+--------+
| Charset | Description     | Default collation | Maxlen |
+---------+-----------------+-------------------+--------+
| utf8    | UTF-8 Unicode   | utf8_general_ci   |      3 |
| ucs2    | UCS-2 Unicode   | ucs2_general_ci   |      2 |
+---------+-----------------+-------------------+--------+

9.11.2. プラットフォーム固有のキャラクタセット

+----------+-----------------------------+---------------------+--------+
| Charset  | Description                 | Default collation   | Maxlen |
+----------+-----------------------------+---------------------+--------+
| dec8     | DEC West European           | dec8_swedish_ci     |      1 |
| hp8      | HP West European            | hp8_english_ci      |      1 |
+----------+-----------------------------+---------------------+--------+

9.11.3. 南ヨーロッパおよび中東のキャラクタセット

+----------+-----------------------------+---------------------+--------+
| Charset  | Description                 | Default collation   | Maxlen |
+----------+-----------------------------+---------------------+--------+
| armscii8 | ARMSCII-8 Armenian          | armscii8_general_ci |      1 |
| cp1256   | Windows Arabic              | cp1256_general_ci   |      1 |
| hebrew   | ISO 8859-8 Hebrew           | hebrew_general_ci   |      1 |
| greek    | ISO 8859-7 Greek            | greek_general_ci    |      1 |
| latin5   | ISO 8859-9 Turkish          | latin5_turkish_ci   |      1 |
| geostd8  | Georgian                    | geostd8_general_ci  |      1 |
+----------+-----------------------------+---------------------+--------+

9.11.4. アジアのキャラクタセット

サポートされているアジアのキャラクタセットには、中国語、日本語、韓国語、タイ語が含まれています。これらは複雑な場合があります。たとえば、中国語のキャラクタセットは数千種類の文字に対応していなければなりません。

+----------+-----------------------------+---------------------+--------+
| Charset  | Description                 | Default collation   | Maxlen |
+----------+-----------------------------+---------------------+--------+
| big5     | Big5 Traditional Chinese    | big5_chinese_ci     |      2 |
| gb2312   | GB2312 Simplified Chinese   | gb2312_chinese_ci   |      2 |
| gbk      | GBK Simplified Chinese      | gbk_chinese_ci      |      2 |
| euckr    | EUC-KR Korean               | euckr_korean_ci     |      2 |
| ujis     | EUC-JP Japanese             | ujis_japanese_ci    |      3 |
| sjis     | Shift-JIS Japanese          | sjis_japanese_ci    |      2 |
| tis620   | TIS620 Thai                 | tis620_thai_ci      |      1 |
+----------+-----------------------------+---------------------+--------+

9.11.4.1. cp932キャラクターセット

なぜcp932 キャラクターセットが必要か

MySQLにおけるsjisキャラクターセットはIANAによって 定義されたShift_JISキャラクターセットに相当し、 JIS X0201、及びJIS X0208文字がサポートされます( http://www.iana.org/assignments/character-setsを参照のこと)。

しかしながら、記述用語として一般的に使われている“シフトJIS”の意味は 非常にあいまいで、しばしば各ベンダーが独自にShift_JISを 拡張したものまで含まれることがあります。

例えば、日本語Windows環境で使用される「シフトJIS」は MicrosoftによるShift_JISの拡張で、正式な名称は Microsoft Windows Codepage : 932もしくは cp932といいます。 cp932では Shift_JISでサポートされる文字に加え、NEC特殊文字、 NEC選定IBM拡張文字、IBM拡張文字といった各種拡張文字がサポートされます。

MySQL 4.1以降、多くの日本語ユーザーがこれら拡張文字等の使用にあたって 問題に直面してきましたが、これらの問題は以下の要因によって生じていました:

  • MySQLが自動的にキャラクターセットの変換を行う。

  • キャラクターセットの変換はUnicode(ucs2)を介して行われる。

  • sjisキャラクターセットはこれら拡張文字の変換をサポートしていない。

  • いわゆる「シフトJIS」と呼ばれるキャラクターセットからUnicodeへの変換には 複数の変換ルールが存在し、いくつかの文字は変換ルールによって異なるUnicode文字に 変換される。MySQLではこれらの変換ルールのうち、一つだけしかサポートされていない (詳細は後述する)。

MySQLのcp932キャラクタセットはこれらの問題を解決するよう デザインされており、MySQL 4.1.12、及び5.0.3以降で使用することができます。

MySQL 4.1より前では、sjis キャラクターセットの使用にあたってどのような「シフトJIS」文字を 使用しても問題はありませんでしたが、4.1以降では、MySQLがキャラクターセットの 変換をサポートするようになった為、異なる変換ルールを持つIANAの Shift_JIScp932を二種類の キャラクターセットとして区別することが重要となります。

cp932sjisとどう異なるか

cp932キャラクターセットは以下の点で sjisと異なります:

  • cp932ではNEC特殊文字、NEC選定IBM拡張文字、IBM拡張文字がサポートされる。

  • いくつかのcp932文字については、二つの異なる コードポイントから同一のUnicodeコードポイントに変換される。 よってこれらの文字をUnicodeからcp932に戻す際には 何れか一つのコードポイントが選択されなくてはならない。 この「ラウンドトリップ変換」については、Microsoftによって 推奨されるルールが使用されている (http://support.microsoft.com/kb/170559/EN-US/を参照のこと)。

    この変換ルールは以下の通り:

    • 当該文字がJIS X 0208文字とNEC特殊文字の両方に存在する場合には、 JIS X 0208のコードポイントを使用する。

    • 当該文字がNEC特殊文字とIBM拡張文字の両方に存在する場合には、 NEC特殊文字のコードポイントを使用する。

    • 当該文字がNEC選定IBM拡張文字とIBM拡張文字の両方に存在する場合には、 IBM拡張文字のコードポイントを使用する。

    cp932文字のUnicodeコードポイントに関する情報は、 http://www.microsoft.com/globaldev/reference/dbcs/932.htm にある表を参照のこと。cp932の表に記載されている文字のうち、 下に四桁の数字が表示されているものについては、その数字は対応するUnicode (ucs2)コードポイントを表す。下線付きの二桁の値については これら二桁の値で始まる一連のcp932文字があることを表し、 これらの値をクリックすることで、その二桁の値で始まる cp932文字、及びそのUnicodeコードポイントが表示される。

    更に興味のある方は以下のリンクを参照のこと。それぞれ、各文字の対応する Unicodeコードポイントを表示する。

  • 5.0.3以降では、eucjpmsキャラクターセットと組み合わせて 使用することで、 cp932でユーザー定義文字の変換がサポートされ、 sjis/ujis間での変換問題にも対応している。 詳細はhttp://www.opengroup.or.jp/jvc/cde/sjis-euc-e.htmlを参照のこと。

  • いくつかの文字については、sjiscp932ucs2との変換ルールが異なる。以下の表ではその違いを説明している。

    ucs2への変換

    sjis/cp932 のコードポイントsjisucs2変換cp932ucs2変換
    5C005C005C
    7E007E007E
    815C20152015
    815F005CFF3C
    8160301CFF5E
    816120162225
    817C2212FF0D
    819100A2FFE0
    819200A3FFE1
    81CA00ACFFE2

    ucs2からの変換:

    ucs2 のコードポイントucs2sjis変換ucs2cp932変換
    005C815F5C
    007E7E7E
    00A281913F
    00A381923F
    00AC81CA3F
    2015815C815C
    201681613F
    2212817C3F
    22253F8161
    301C81603F
    FF0D3F817C
    FF3C3F815F
    FF5E3F8160
    FFE03F8191
    FFE13F8192
    FFE23F81CA

9.11.5. バルト語キャラクタセット

バルト語キャラクタセットには、エストニア語、ラトビア語、リトアニア語が含まれています。現在サポートされているバルト語キャラクタセットは以下の 2 つです:

  • latin7(ISO 8859-13 バルト語):

    +----------------------+----------+----+---------+----------+---------+
    | Collation            | Charset  | Id | Default | Compiled | Sortlen |
    +----------------------+----------+----+---------+----------+---------+
    | latin7_estonian_cs   | latin7   | 20 |         |          |       0 |
    | latin7_general_ci    | latin7   | 41 | Yes     |          |       0 |
    | latin7_general_cs    | latin7   | 42 |         |          |       0 |
    | latin7_bin           | latin7   | 79 |         |          |       0 |
    +----------------------+----------+----+---------+----------+---------+
    

  • cp1257(Windows バルト語):

    +----------------------+----------+----+---------+----------+---------+
    | Collation            | Charset  | Id | Default | Compiled | Sortlen |
    +----------------------+----------+----+---------+----------+---------+
    | cp1257_lithuanian_ci | cp1257   | 29 |         |          |       0 |
    | cp1257_bin           | cp1257   | 58 |         |          |       0 |
    | cp1257_general_ci    | cp1257   | 59 | Yes     |          |       0 |
    +----------------------+----------+----+---------+----------+---------+
    

9.11.6. キリル語キャラクタセット

ベラルーシ語、ブルガリア語、ロシア語、ウクライナ語と共に使用するキリル語のキャラクタセットおよび照合順序を以下に示します。

  • cp1251(Windows キリル語)

    +----------------------+----------+----+---------+----------+---------+
    | Collation            | Charset  | Id | Default | Compiled | Sortlen |
    +----------------------+----------+----+---------+----------+---------+
    | cp1251_bulgarian_ci  | cp1251   | 14 |         |          |       0 |
    | cp1251_ukrainian_ci  | cp1251   | 23 |         |          |       0 |
    | cp1251_bin           | cp1251   | 50 |         |          |       0 |
    | cp1251_general_ci    | cp1251   | 51 | Yes     |          |       0 |
    | cp1251_general_cs    | cp1251   | 52 |         |          |       0 |
    +----------------------+----------+----+---------+----------+---------+
    

  • cp866 (DOS ロシア語):

    +----------------------+----------+----+---------+----------+---------+
    | Collation            | Charset  | Id | Default | Compiled | Sortlen |
    +----------------------+----------+----+---------+----------+---------+
    | cp866_general_ci     | cp866    | 36 | Yes     |          |       0 |
    | cp866_bin            | cp866    | 68 |         |          |       0 |
    +----------------------+----------+----+---------+----------+---------+
    

  • koi8r(KOI8-R Relcom Russian、Unix 上で主としてロシア語に使用):

    +----------------------+----------+----+---------+----------+---------+
    | Collation            | Charset  | Id | Default | Compiled | Sortlen |
    +----------------------+----------+----+---------+----------+---------+
    | koi8r_general_ci     | koi8r    |  7 | Yes     |          |       0 |
    | koi8r_bin            | koi8r    | 74 |         |          |       0 |
    +----------------------+----------+----+---------+----------+---------+
    

  • koi8u(KOI8-R Ukrainian、Unix 上で主としてウクライナ語に使用):

    +----------------------+----------+----+---------+----------+---------+
    | Collation            | Charset  | Id | Default | Compiled | Sortlen |
    +----------------------+----------+----+---------+----------+---------+
    | koi8u_general_ci     | koi8u    | 22 | Yes     |          |       0 |
    | koi8u_bin            | koi8u    | 75 |         |          |       0 |
    +----------------------+----------+----+---------+----------+---------+
    

9.11.7. 中央ヨーロッパのキャラクタセット

チェコ、スロバキア、ハンガリー、ルーマニア、スロベニア、クロアチア、ポーランドで使用されるキャラクタセットも一部サポートされています。

  • cp1250(Windows 中央ヨーロッパ):

    +----------------------+----------+----+---------+----------+---------+
    | Collation            | Charset  | Id | Default | Compiled | Sortlen |
    +----------------------+----------+----+---------+----------+---------+
    | cp1250_general_ci    | cp1250   | 26 | Yes     |          |       0 |
    | cp1250_czech_ci      | cp1250   | 34 |         | Yes      |       2 |
    | cp1250_bin           | cp1250   | 66 |         |          |       0 |
    +----------------------+----------+----+---------+----------+---------+
    

  • cp852(DOS 中央ヨーロッパ):

    +----------------------+----------+----+---------+----------+---------+
    | Collation            | Charset  | Id | Default | Compiled | Sortlen |
    +----------------------+----------+----+---------+----------+---------+
    | cp852_general_ci     | cp852    | 40 | Yes     |          |       0 |
    | cp852_bin            | cp852    | 81 |         |          |       0 |
    +----------------------+----------+----+---------+----------+---------+
    

  • macce(Mac 中央ヨーロッパ):

    +----------------------+----------+----+---------+----------+---------+
    | Collation            | Charset  | Id | Default | Compiled | Sortlen |
    +----------------------+----------+----+---------+----------+---------+
    | macce_general_ci     | macce    | 38 | Yes     |          |       0 |
    | macce_bin            | macce    | 43 |         |          |       0 |
    +----------------------+----------+----+---------+----------+---------+
    

  • latin2(ISO 8859-2 中央ヨーロッパ):

    +----------------------+----------+----+---------+----------+---------+
    | Collation            | Charset  | Id | Default | Compiled | Sortlen |
    +----------------------+----------+----+---------+----------+---------+
    | latin2_czech_ci      | latin2   |  2 |         | Yes      |       4 |
    | latin2_general_ci    | latin2   |  9 | Yes     |          |       0 |
    | latin2_hungarian_ci  | latin2   | 21 |         |          |       0 |
    | latin2_croatian_ci   | latin2   | 27 |         |          |       0 |
    | latin2_bin           | latin2   | 77 |         |          |       0 |
    +----------------------+----------+----+---------+----------+---------+
    

  • keybcs2(DOS Kamenicky Czech-Slovak):

    +----------------------+----------+----+---------+----------+---------+
    | Collation            | Charset  | Id | Default | Compiled | Sortlen |
    +----------------------+----------+----+---------+----------+---------+
    | keybcs2_general_ci   | keybcs2  | 37 | Yes     |          |       0 |
    | keybcs2_bin          | keybcs2  | 73 |         |          |       0 |
    +----------------------+----------+----+---------+----------+---------+
    

9.11.8. 西ヨーロッパのキャラクタセット

西ヨーロッパのキャラクタセットには、大部分の西ヨーロッパ言語(フランス語、スペイン語、カタロニア語、バスク語、ポルトガル語、イタリア語、アルバニア語、オランダ語、ドイツ語、デンマーク語、スウェーデン語、ノルウェー語、フィンランド語、フェロー語、アイスランド語、アイルランド語、スコットランド語、英語など)が含まれています。

  • latin1(ISO 8859-1 西ヨーロッパ):

    +----------------------+----------+----+---------+----------+---------+
    | Collation            | Charset  | Id | Default | Compiled | Sortlen |
    +----------------------+----------+----+---------+----------+---------+
    | latin1_german1_ci    | latin1   |  5 |         |          |       0 |
    | latin1_swedish_ci    | latin1   |  8 | Yes     | Yes      |       0 |
    | latin1_danish_ci     | latin1   | 15 |         |          |       0 |
    | latin1_german2_ci    | latin1   | 31 |         | Yes      |       2 |
    | latin1_bin           | latin1   | 47 |         | Yes      |       0 |
    | latin1_general_ci    | latin1   | 48 |         |          |       0 |
    | latin1_general_cs    | latin1   | 49 |         |          |       0 |
    +----------------------+----------+----+---------+----------+---------+
    

    latin1_swedish_ci 照合順序は、MySQL ユーザの大多数がデフォルトとして使用していると考えられます。一貫して述べてきたように、これはスウェーデン語/フィンランド語の照合順序ルールに基づいていますが、スウェーデンとフィンランドには意見の異なるユーザも存在します。

    latin1_german1_ci および latin1_german2_ci 照合順序は DIN-1 および DIN-2 標準に基づきます。ここで DIN とは Deutsches Institut fur Normung(ドイツ工業規格。ANSI のドイツ版)を指します。 DIN-1 は辞書照合、DIN-2 は電話帳照合と呼ばれています。

    • latin1_german1_ci(辞書)ルール:


      ??????‘A’?=?‘A’,?‘O’?=?‘O’,?‘U’?=?‘U’,?‘s’?=?‘s
      ??????

    • latin1_german2_ci(電話帳)ルール:


      ??????‘A’?=?'AE',?‘O’?=?'OE',?‘U’?=?'UE',?‘s’?=?'ss'
      ??????

  • macroman(Mac 西ヨーロッパ):

    +----------------------+----------+----+---------+----------+---------+
    | Collation            | Charset  | Id | Default | Compiled | Sortlen |
    +----------------------+----------+----+---------+----------+---------+
    | macroman_general_ci  | macroman | 39 | Yes     |          |       0 |
    | macroman_bin         | macroman | 53 |         |          |       0 |
    +----------------------+----------+----+---------+----------+---------+
    

  • cp850(DOS 西ヨーロッパ):

    +----------------------+----------+----+---------+----------+---------+
    | Collation            | Charset  | Id | Default | Compiled | Sortlen |
    +----------------------+----------+----+---------+----------+---------+
    | cp850_general_ci     | cp850    |  4 | Yes     |          |       0 |
    | cp850_bin            | cp850    | 80 |         |          |       0 |
    +----------------------+----------+----+---------+----------+---------+
    


This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The original Reference Manual is in English, and this translation is not necessarily as up to date as the English version.

アダルトレンタルサーバー