第9章 キャラクタセットサポート

目次

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. 他のDBMSとの互換性
9.4. 接続のキャラクタセットおよび照合順序
9.5. 照合順序に関して
9.5.1. SQLステートメントCOLLATE節を使用する
9.5.2. COLLATE節の優先順位
9.5.3. BINARY オペレータ
9.5.4. 照合順序を決定するのが難しい特殊なケース
9.5.5. 照合順序は適切なキャラクタセットに対応していること。
9.5.6. 照合順序がもたらす結果の例
9.6. キャラクタセットのサポートによる影響を受ける演算
9.6.1. 結果文字列
9.6.2. CONVERT()CAST()
9.6.3. SHOW ステートメントとINFORMATION_SCHEMA
9.7. Unicodeのサポート
9.8. メタデータ用の UTF8
9.9. カラムキャラクタセット変換
9.10. MySQL でサポートされるキャラクタセットと照合順序
9.10.1. Unicode キャラクタセット
9.10.2. 西ヨーロッパのキャラクタセット
9.10.3. 中央ヨーロッパのキャラクタセット
9.10.4. 南ヨーロッパおよび中東のキャラクタセット
9.10.5. バルト語のキャラクタセット
9.10.6. キリル語のキャラクタセット
9.10.7. アジアのキャラクタセット

MySQLでは、各種のキャラクタセットを使用してデータを保存したり、各種の照合順序を使用してデータを比較したりできます。サーバ、データベース、テーブルおよびカラムレベルでのキャラクタセット指定が可能です。MySQLは、MyISAMMEMORYNDBClusterそしてInnoDB記憶エンジンでのキャラクタセット使用をサポートしています。

この章では、以下について説明します。

キャラクタセットから生じた問題は、データ保存だけでなく、クライアントプログラムとMySQLサーバ間の通信にも影響を与えます。デフォルトと異なるキャラクタセットを使用してクライアントプログラムとサーバ間の通信を行いたい場合、どれを使用するのかを知らせる必要があります。例えば、utf8 Unicode キャラクタセットを使用するには、サーバ接続後にその旨を知らせてください。

SET NAMES 'utf8';

キャラクタセットに関するクライアント−サーバ間の通信問題について、さらに詳しく知りたい場合はこちらを参照してください。項9.4. 「接続のキャラクタセットおよび照合順序」.

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

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

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

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

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

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

MySQLでは以下が可能です。

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

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

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

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

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

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

MySQLサーバでは複数のキャラクタセットがサポートされています。利用可能なキャラクタセットは、SHOW CHARACTER SETステートメントを実行するとリストアップされます。リストの一部を以下に表示します。さらに詳しい情報が必要な場合は、次を参照してください。項9.10. 「MySQL でサポートされるキャラクタセットと照合順序」

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   | cp1252 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 |
| 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 |
...

キャラクタセットには少なくとも1つの照合順序が含まれており、複数の照合順序が含まれていることもあります。あるキャラクタセットに対して存在する照合順序をリストアップするには、SHOW COLLATIONステートメントを実行してください。例えば、キャラクタセットlatin1 (cp1252 西ヨーロッパ言語)に含まれる照合順序を調べるには、このステートメントを実行するとlatin1で始まる照合順序が見つかります。

mysql> SHOW COLLATION LIKE 'latin1%';
+---------------------+---------+----+---------+----------+---------+
| Collation           | Charset | Id | Default | Compiled | Sortlen |
+---------------------+---------+----+---------+----------+---------+
| latin1_german1_ci   | latin1  |  5 |         |          |       0 |
| latin1_swedish_ci   | latin1  |  8 | Yes     | Yes      |       1 |
| latin1_danish_ci    | latin1  | 15 |         |          |       0 |
| latin1_german2_ci   | latin1  | 31 |         | Yes      |       2 |
| latin1_bin          | latin1  | 47 |         | Yes      |       1 |
| latin1_general_ci   | latin1  | 48 |         |          |       0 |
| latin1_general_cs   | latin1  | 49 |         |          |       0 |
| latin1_spanish_ci   | latin1  | 94 |         |          |       0 |
+---------------------+---------+----+---------+----------+---------+

latin1の照合順序には以下の意味があります:

照合順序意味
latin1_german1_ciドイツ語 DIN-1
latin1_swedish_ciスウェーデン語/フィンランド語
latin1_danish_ciデンマーク語/ノルウェー語
latin1_german2_ciドイツ語 DIN-2
latin1_binlatin1エンコードに基づくバイナリ
latin1_general_ciマルチリンガル(西ヨーロッパ言語)
latin1_general_csマルチリンガル(ISO 西ヨーロッパ言語)大文字と小文字が区別される
latin1_spanish_ci現代スペイン語

照合順序にはこれらの一般的な特徴があります。

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

  • 各キャラクタセットには、デフォルト照合順序が1つ存在します。例えば、latin1のデフォルト照合順序はlatin1_swedish_ciです。SHOW CHARACTER SETから、どの照合順序が表示されているどのキャラクタセットのデフォルトであるかがわかります。

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

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

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

CHARACTER SETはキャラクタセットを指定する節で使用します。CHARSETCHARACTER SETの同義語として使用します。

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

MySQLサーバにはサーバキャラクタセットとサーバ照合順序があります。サーバキャラクタセットとサーバ照合順序は、サーバ起動時に設定でき、ランタイムで変更できます。

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

shell> mysqld
shell> mysqld --character-set-server=latin1
shell> mysqld --character-set-server=latin1 \
           --collation-server=latin1_swedish_ci

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

shell> ./configure --with-charset=latin1

または

shell> ./configure --with-charset=latin1 \
           --with-collation=latin1_german1_ci

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

最新のサーバキャラクタセットと照合順序は、character_set_serverおよびcollation_serverのシステム変数値で決定されます。これらの変数はランタイムで変更可能です。

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

各データベースにはデータベースキャラクタセットとデータベース照合順序があります。CREATE DATABASEおよびALTER DATABASEステートメントには、データベースのキャラクタセットと照合順序を指定するためのオプション節があります。

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

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

SCHEMAというキーワードはDATABASEの代わりに使用できます。

すべてのデータベースオプションは、データベースディレクトリ内のdb.optというテキストファイルに保存されます。

CHARACTER SETおよびCOLLATE節で、キャラクタセットと照合順序が異なる複数のデータベースを同一のMySQLサーバ上に作成することができます。

例:

CREATE DATABASE db_name CHARACTER SET latin1 COLLATE latin1_swedish_ci;

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

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

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

  • COLLATE Yを指定し、CHARACTER SETを指定しなかった場合は、Y関連のキャラクタセットと照合順序Y

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

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

デフォルトのデータベースに対するキャラクタセットと照合順序は、character_set_databaseおよびcollation_databaseのシステム変数値によって決定されます。デフォルトのデータベースが変わるたびに、サーバはこれらの変数を設定します。デフォルトのデータベースがない場合、変数は、character_set_serverおよびcollation_serverといったサーバレベルのシステム変数と同値になります。

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

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

CREATE TABLE tbl_name (column_list)
    [[DEFAULT] CHARACTER SET charset_name] [COLLATE collation_name]]

ALTER TABLE tbl_name
    [[DEFAULT] CHARACTER SET charset_name] [COLLATE collation_name]

例:

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

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

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

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

  • COLLATE Yを指定し、CHARACTER SETを指定しなかった場合は、Y関連のキャラクタセットと照合順序Y

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

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

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

各「文字」(CHARVARCHARまたはTEXT型)にはカラムキャラクタセットとカラム照合順序があります。カラム定義構文には、カラムキャラクタセットとカラム照合順序を指定するためのオプション節があります。

col_name {CHAR | VARCHAR | TEXT} (col_length)
    [CHARACTER SET charset_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とそのデフォルト照合順序。

  • COLLATE Yを指定し、CHARACTER SETを指定しなかった場合は、Y関連のキャラクタセットと照合順序Y

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

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

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

各文字列リテラルにはキャラクタセットと照合順序があります。

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

[_charset_name]'string' [COLLATE collation_name]

例:

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

単純なステートメントSELECT 'string'に対して、文字列にはcharacter_set_connectionおよびcollation_connectionシステム変数で定義されたキャラクタセットと照合順序が存在します。

_charset_nameは形式上イントロデューサと呼ばれています。指定すると、「キャラクタセットXの文字列が後続する」ことがパーサに通知されます。上記はユーザの混乱を招いていたため、ここで強調しておきますが、イントロデューサは変換の原因にはならず、文字列の値が変更されないことを示すにすぎません。標準的な16進リテラルおよび数値16進リテラルの表記(x'literal'および0xnnnn)の前でも、イントロデューサは有効です。

例:

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

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

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

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

  • その他の場合は、character_set_connectionおよびcollation_connectionシステム変数が指定するリテラルキャラクタセットとリテラル照合順序。

例:

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

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

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

    SELECT 'Muller';
    

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

イントロデューサは後続の文字列に対してキャラクタセットを指定しますが、現在のところ、その文字列におけるパーサのエスケーププロセス内容までは変更しません。エスケープは常に、character_set_connectionに指定されたキャラクタセットに従ってパーサが実行します。

以下の例は、イントロデューサが存在してもcharacter_set_connectionによるエスケーププロセスが生じる場合についてです。例ではSET NAMES(character_set_connectionを変更する項9.4. 「接続のキャラクタセットおよび照合順序」), を用いてHEX() ファンクションを使い結果文字列を表示させることで、正確文字列の内容を確認することができます。.

例1:

mysql> SET NAMES latin1;
Query OK, 0 rows affected (0.01 sec)

mysql> SELECT HEX('a\n'), HEX(_sjis'a\n');
+------------+-----------------+
| HEX('a\n') | HEX(_sjis'a\n') |
+------------+-----------------+
| E00A       | E00A            | 
+------------+-----------------+
1 row in set (0.00 sec)

ここでは ‘a’ (16進E0) の後に‘\n’ニューラインのエスケープシーケンスが続きます。エスケープシーケンスはcharacter_set_connectionlatin1 の値を使い、新しいリテラルニューラインを作成します。(16進 0A)。これは2番目の文字列にも起こります。つまり、_sjisのイントロデューサはパーサのエスケーププロセスに影響を及ぼしません。

例2:

mysql> SET NAMES sjis;
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT HEX('a\n'), HEX(_latin1'a\n');
+------------+-------------------+
| HEX('a\n') | HEX(_latin1'a\n') |
+------------+-------------------+
| E05C6E     | E05C6E            | 
+------------+-------------------+
1 row in set (0.04 sec)

ここでは character_set_connectionsjisになります。このキャラクタセットは次のシーケンス‘a’ と‘\’ (hex values 05 and 5C)がつづく、 有効なマルチバイトキャラクタです。よって、文字列の最初の2バイトは1つのsjis キャラクタとして実行され、‘\’ はエスケープキャラクタとし実行されない。次の‘n’ (16進値6E) はエスケープシーケンスの一部として実行されません。これは第2文字列にとっても同様に、_latin1のイントロデューサはエスケーププロセッシングに影響しません。

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

標準SQL ではNCHARまたはNATIONAL CHARが、事前定義キャラクタセットがCHARカラムで使用されるように指定する方法のひとつとして使われています。MySQLでは5.1utf8事前定義キャラクタセットとして使用されます。例えば、以下のデータタイプ宣言は等価です:

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'を使用して、各国キャラクタセットの文字列を 作成することができます。以下の二つのステートメントは等価です

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

バージョン4.1以前のMySQLにキャラクタセットをアップグレードするには、5.1 MySQL 3.23, 4.0, 4.1 リファレンスマニュアルを参照してください。.

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

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_swedish_ci の照合順序ではなく、latin1_danish_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 のキャラクタセットはlatin1、照合順序はlatin1_czech_ciとなります。

9.3.8. 他のDBMSとの互換性

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

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

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

複数のキャラクタセットとシステム変数はサーバとクライアント間の通信に関係しています。いくつかは前セクションですでに説明されています。

  • サーバキャラクタセットと照合順序は、character_set_serverおよびcollation_serverのシステム変数値で決定されます。

  • デフォルトのデータベースに対するキャラクタセットと照合順序は、character_set_databaseおよびcollation_databaseのシステム変数値によって決定されます。

追加キャラクタセットと照合順序システム変数がクライアント・サーバー間のコネクショントラフィックを統括する役目を担っています。どのクライアントもコネクション関係のキャラクタセットと照合順序システム変数を持っています。

”接続”」 とはなんでしょう。”接続”とは、サーバへの接続時に作成されるものです。クライアントは接続を介し、SQL ステートメント(クエリなど)をサーバに送信します。サーバでは接続を介し、応答(結果セットなど)をクライアントに返します。 これによって、次のような、クライアントの接続についてキャラクタセットと照合順序疑に関する問が生じます。これら疑問に関する答えはシステム変数値によって導き出されます。

  • クライアントから送信される際にステートメントはどのキャラクタセットで送られるのか。

    サーバは character_set_clientシステム変数値をそのままクライアントの送るステートメントのキャラクタセットにします。

  • サーバではクエリを受信した後にどのキャラクタセットに変換するのか。

    これには、サーバは character_set_connectioncollation_connectionのシステム変数値を使用します。 クライアントから送られたステートメントをcharacter_set_client からcharacter_set_connection に変換します(ただし_latin1 あるいは_utf8のようなイントロデューサのある文字列リテラルは除く). collation_connectionはリテラル文字列の比較にとって重要です。カラム値のある文字列の比較には、collation_connectionは重要視されません。なぜならカラムには自身の照合順序があり、優先的にこれらの照合順序を参照するからです。

  • サーバでは結果セットまたはエラーメッセージをクライアントに返送する前にどのキャラクタセットに変換するのか。

    character_set_resultsの システム変数値はサーバがどのキャラクタセットでクライアントにクエリ結果を返信するかを指定しています。これはカラム値やメタデータ結果に含まれるカラム名などの結果データを含みます。

これらは細かく調整することができますが、デフォルトを適用することもできます。デフォルトを適用する場合、このセクションをとばしてかまいません。

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

SET NAMES 'charset_name'
SET CHARACTER SET charset_name

SET NAMESは、クライアントから送信される SQL ステートメントのキャラクタセットを示します。たとえば、SET NAMES 'cp1251' は 「「このクライアントからの入力メッセージは今後、キャラクタセット cp1251.になります」」 とサーバに通知します。加えて、クライアントに結果を返信する際サーバーが使用するべきキャラクタセットも指定します。(例えば、SELECTステートメントを使った場合どのカラム値に対してどのキャラクタセットを使用したらいいか指定します。)

SET NAMES 'x'ステートメントは下記の3ステートメントと等価です。

SET character_set_client = x;
SET character_set_results = x;
SET character_set_connection = x;

character_set_connectionxにセットするとcollation_connectionxのデフォルト照合順序にセットされます。その照合順序を正確にセットする必要はありません。キャラクタセットに特定の照合順序を指定するには、オプションのCOLLATE節を使用してください。

SET NAMES 'charset_name' COLLATE 'collation_name'

SET CHARACTER SETSET NAMESに似ていますがcharacter_set_connectioncollation_connectioncharacter_set_databasecollation_databaseにセットします。SET CHARACTER SET xステートメントは下記の3ステートメントと等価です。

SET character_set_client = x;
SET character_set_results = x;
SET collation_connection = @@collation_database;

collation_connectionを指定するとcharacter_set_connectionも照合順序に関係するキャラクタセットに指定されます(SET character_set_connection = @@character_set_databaseを実行することと同様)。character_set_connectionを正確に指定する必要はありません。

クライアント接続時、使用したいキャラクタセット名がサーバーに送られます。サーバはこのキャラクタセット名を使ってcharacter_set_clientcharacter_set_results、そしてcharacter_set_connectionのシステム変数値を指定します。結果的に、サーバはキャラクタセット名を使用してSET NAMESオペレーションを実行します。

デフォルト以外のキャラクタセットを使用したい場合、mysql クライアントでは、起動するたびに SET NAMESを実行する必要はありません。--default-character-setオプション設定をmysqlステートメントラインか、オプションファイルに追加することができます。たとえば、以下のオプション設定ファイルの設定では、mysql:を実行する度に、三つのキャラクタセット変数値をkoi8rに変更します。

[mysql]
default-character-set=koi8r

もしmysqlクライアントの自動再接続(推奨されていません)を使用しているのであれば、SET NAMESよりもcharsetを使用することをお勧めします。例:

mysql> charset utf8
Charset changed

charsetコマンドはSET NAMESステートメントを発行し、mysql 接続が解除され再接続された場合に使用されているデフォルトキャラクタセットも変更します。

例:例えばcolumn1CHAR(5) CHARACTER SET latin2として定義されていたとします。もしSET NAMES あるいはSET CHARACTER SETではない場合、SELECT column1 FROM tに関してサーバはcolumn1の値を、接続時にクライアントが指定したすべての値を返信します。逆にSET NAMES 'latin1'あるいはSET CHARACTER SET latin1SELECTステートメントを発行する前に使用した場合,サーバーは結果を返信する前にlatin2の値をlatin1に変換します。.そのような変換は低速であり、損失につながることもあります。

サーバに結果セットの変換を実行をしてほしくない場合は、character_set_resultsNULLに指定してください。

SET character_set_results = NULL;

:現在、UCS-2 クライアントのキャラクタセットとして使用ができません。これはSET NAMES 'ucs2'が使用できないことを意味します。

コネクションに関係するキャラクタセットや照合順序システム変数値を参照するには、下記のステートメントを使用してください。

SHOW VARIABLES LIKE 'character_set%';
SHOW VARIABLES LIKE 'collation%';

9.5. 照合順序に関して

下記のセクションではキャラクタセットの照合順序に関する事項を紹介します。

9.5.1. 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;
    
         SELECT *
         FROM t1
         WHERE k LIKE _latin1 'Muller' COLLATE latin1_german2_ci;
    
  • HAVINGを指定した場合

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

9.5.2. COLLATE節の優先順位

COLLATE節は優先順位が高いため(||よりも高い)、下記の2つの式は等価となります。

x || y COLLATE z
x || (y COLLATE z)

9.5.3. BINARY オペレータ

BINARYオペレータは2進性の文字列に続く文字列を送信します。キャラクタ毎よりも、バイト毎の比較を強制的に行う簡単な方法です。BINARYは後続のスペースにも重要な意味を持たせます。

mysql> SELECT 'a' = 'A';
        -> 1
mysql> SELECT BINARY 'a' = 'A';
        -> 0
mysql> SELECT 'a' = 'a ';
        -> 1
mysql> SELECT BINARY 'a' = 'a ';
        -> 0

BINARY strCAST(str AS BINARY)の略でもあります。

キャラクタカラム定義のBINARY性質は別の効果があります。BINARY性質で定義されたキャラクタカラムはカラムのキャラクタセットの二進節を割り当てられます。全てのキャラクタセットに二進節があります。例えば、latin1 キャラクタセットの二進節はlatin1_binです。よってデフォルトキャラクタセットがlatin1の場合、下記の2カラムの定義は等価になります。

CHAR(10) BINARY
CHAR(10) CHARACTER SET latin1 COLLATE latin1_bin

BINARYのカラム性質としての効果はMySQL4.1.の時のそれと効果に違いがあります。以前、BINARYは結果二進文字列として扱われたカラムになりました。二進文字列は、キャラクタセットや照合順序のないバイトの列で、二進照合順序のある非二審キャラクタ文字列とは違います。両文字列にとって、比較は文字列のユニットの数値をもって行われます。しかし非二審文字列にとってはユニットはキャラクタであり、キャラクタセットの中にはマルチバイトキャラクタを許容しているものもあります。 項10.4.2. 「BINARYVARBINARY タイプ」.

CHARACTER SET binaryCHARVARCHARあるいはTEXTカラム定義での使用は二進性のデータタイプとしてカラムを扱うことになります。例えば、下記の定義は等価です

CHAR(10) CHARACTER SET binary
BINARY(10)

VARCHAR(10) CHARACTER SET binary
VARBINARY(10)

TEXT CHARACTER SET binary
BLOB

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

大多数のクエリでは、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節の優先順位は0です。(優先されません)

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

  • カラムの照合順序、保存されたルーチンパラメータ、もしくはローカル変数値は優先順位が 2。

  • システム定数」 (USER() またはVERSION()といったファンクションに返される文字列) の優先順位は3。

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

  • NULLもしくはNULL由来の表現の優先順位は5。

先行する優先順位の値は現MySQLのものである。5.1

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

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

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

例:

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

COERCIBILITY()ファンクションで文字列表現の優先順位が決定できます。

mysql> SELECT COERCIBILITY('A' COLLATE latin1_swedish_ci);
        -> 0
mysql> SELECT COERCIBILITY(VERSION());
        -> 3
mysql> SELECT COERCIBILITY('A');
        -> 4

詳しくはこちらをを参照してください。項11.10.3. 「情報関数」

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

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

mysql> SELECT _latin1 'x' COLLATE latin2_bin;
ERROR 1253 (42000): COLLATION 'latin2_bin' is not valid
for CHARACTER SET 'latin1'

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

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

Muffler
Muller
MX Systems
MySQL

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

SELECT X FROM T ORDER BY X COLLATE collation_name;

この表は、複数の異なった照合順序を ORDER BY節で使用した結果の一例です。

latin1_swedish_cilatin1_german1_cilatin1_german2_ci
MufflerMufflerMuller
MX SystemsMullerMuffler
MullerMX SystemsMX Systems
MySQLMySQLMySQL

例では、2 個の点が上に付いている U が問題の原因です(u)。この文字をドイツでは「ウムラウト」と呼んでいますが、私たちは分音記号付きの U と呼んでいます。

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

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

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

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

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

9.6.1. 結果文字列

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

文字列の入力を取得して文字列の結果を出力として返す単純な関数では、出力のキャラクタセットおよび照合順序は主要な入力のキャラクタセットおよび照合順序と同じです。たとえば UPPER(X)は、キャラクタセットおよび照合が Xと一致する文字列を返します。同じことはいかについても当てはまります。INSTR()LCASE()LOWER()LTRIM()MID()REPEAT()REPLACE()REVERSE()RIGHT()RPAD()RTRIM()SOUNDEX()SUBSTRING()TRIM()UCASE() そして UPPER()

注:REPLACE()関数は他のすべての関数とは異なり、文字列入力の照合順序を無視し、大文字と小文字が区別される比較を毎回実行します。

入力文字列あるいはファンクションの結果がバイナリ文字列の場合、キャラクタセットあるいは照合順序に対する文字列はありません。これはCHARSET()COLLATION()ファンクションを使ってチェックすることができます。両ファンクションとも、引数がバイナリ文字列であると明示するためbinaryを返します。

mysql> SELECT CHARSET(BINARY 'a'), COLLATION(BINARY 'a');
+---------------------+-----------------------+
| CHARSET(BINARY 'a') | COLLATION(BINARY 'a') |
+---------------------+-----------------------+
| binary              | binary                |
+---------------------+-----------------------+

複数の文字列入力を組み合わせて単一の文字列出力を返す操作には、標準SQLの「集約ルール」が適用されます。

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

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

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

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

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

文字データを変換する操作のため、結果文字列のキャラクタセットと照合順序はcharacter_set_connectioncollation_connectionシステム変数値によって定義されています。.このことは以下についてのみ当てはまります。CAST()CONV()FORMAT()HEX()SPACE()

もし文字列ファンクションに返された結果のキャラクタセットや照合順序にたいして不明の場合、確かめるためにCHARSET()またはCOLLATE()ファンクションを使用してください。

mysql> SELECT USER(), CHARSET(USER()), COLLATION(USER());
+----------------+-----------------+-------------------+
| USER()         | CHARSET(USER()) | COLLATION(USER()) |
+----------------+-----------------+-------------------+
| test@localhost | utf8            | utf8_general_ci   | 
+----------------+-----------------+-------------------+

9.6.2. CONVERT()CAST()

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の仕様に基づき実装されています。

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

CAST(character_string AS character_data_type CHARACTER SET charset_name)

例:

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

CAST()woCHARACTER SETの指定なしで使用した場合、キャラクタセットと照合順序はcharacter_set_connectioncollation_connectionのシステム変数で定義されます。CAST()CHARACTER SET Xの指定ありで使用した場合、キャラクタセットはX、照合順序はXのデフォルト照合順序になります。

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

例:

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

9.6.3. SHOW ステートメントとINFORMATION_SCHEMA

複数のSHOW ステートメントからキャラクタセットの追加情報が得られます。これらの中にはSHOW CHARACTER SETSHOW COLLATIONSHOW CREATE DATABASESHOW CREATE TABLE そしてSHOW COLUMNSが含まれます。これらのステートメントを以下に簡単に挙げます。

さらに詳しい情報が必要な場合は、次を参照してください項12.5.4. 「SHOW 構文」

INFORMATION_SCHEMA にはSHOWステートメントで表示される情報に類似した複数のテーブルが含まれます。例えば、CHARACTER_SETSおよびCOLLATIONS テーブルはSHOW CHARACTER SETおよびSHOW COLLATIONで表示される情報を含みます。 章?21. INFORMATION_SCHEMA データベース.

SHOW CHARACTER SETコマンドは全ての有効なキャラクタセットを示します。どのキャラクタセット名を整合させるかはオプションのLIKE節が使用されます。例:

mysql> SHOW CHARACTER SET LIKE 'latin%';
+---------+-----------------------------+-------------------+--------+
| Charset | Description                 | Default collation | Maxlen |
+---------+-----------------------------+-------------------+--------+
| latin1  | cp1252 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 |
+---------+-----------------------------+-------------------+--------+

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 |
| latin1_spanish_ci | latin1  | 94 |         |          |       0 |
+-------------------+---------+----+---------+----------+---------+

SHOW CREATE DATABASEは指定されたデータベースを作成するCREATE DATABASEステートメントを示します。

mysql> SHOW CREATE DATABASE test;
+----------+-----------------------------------------------------------------+
| Database | Create Database                                                 |
+----------+-----------------------------------------------------------------+
| test     | CREATE DATABASE `test` /*!40100 DEFAULT CHARACTER SET latin1 */ |
+----------+-----------------------------------------------------------------+

COLLATE節が表示されていなければキャラクタセットのデフォルト照合順序が適用されます。

SHOW CREATE TABLE は類似していますが、CREATE TABLE既存のテーブルを作成するためのステートメントを表示します。カラム定義はキャラクタセット仕様を指定し、テーブルオプションはキャラクタセット情報を含んでいます。

SHOW COLUMNSステートメントはSHOW FULL COLUMNSとして実行された場合、テーブルカラムの照合順序を表示します。CHARVARCHAR、またはTEXTデータ型を含むカラムには照合順序があります。ニューメリックと他の文字列の存在しない型には照合順序がありません(Collation値としてNULLで表示されます)。例:

mysql> SHOW FULL COLUMNS FROM person\G
*************************** 1. row ***************************
     Field: id
      Type: smallint(5) unsigned
 Collation: NULL
      Null: NO
       Key: PRI
   Default: NULL
     Extra: auto_increment
Privileges: select,insert,update,references
   Comment:
*************************** 2. row ***************************
     Field: name
      Type: char(60)
 Collation: latin1_swedish_ci
      Null: NO
       Key:
   Default:
     Extra:
Privileges: select,insert,update,references
   Comment:

キャラクタセットは表示の一部ではなく照合順序名で示されます。

9.7. Unicodeのサポート

MySQL 5.1Unicode データを保存するために次の二つのキャラクタセットが用意されています

  • ucs2( the UCS-2 Unicode キャラクタセット)

  • utf8(Unicode キャラクタセットのUTF-8 エンコード)

UCS-2(Unicode のバイナリ表現)では、各文字は 2 バイトの Unicode と最上位のバイトで最初に表現されます。例:LATIN CAPITAL LETTER A はコード0x0041で、2バイトシーケンスで保存されます。0x00 0x41CYRILLIC SMALL LETTER YERU (Unicode0x044B) は2バイトシーケンスとして保存されます。0x00 0x41。Unicode 文字および対応するコードについては、Unicode Home Pageを参照してください。

現在、UCS-2はクライアントキャラクタセットとして使用ができません。これはSET NAMES 'ucs2'が使用できないことを意味します。

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

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

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

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

RFC 3629 は1から4バイトまでのエンコードシーケンスを示します。現在、MySQLではUTF-8に対して4バイトシーケンスのサポートは含みません。(UTF-8 エンコードの旧標準はRFC 2279で提供されています。これは1から6バイトのUTF-8シーケンスを示しています。RFC 3629 はRFC 2279 を無効にします。このため、5と6バイトのシーケンスはすでに使用されていません。

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

9.8. メタデータ用の UTF8

メタデータとはデータについてのデータです。」データベース?の内容となっているデータではなく、データベース?について説明するデータがメタデータです。 したがって、カラム名、データベース名、ユーザ名、バージョン名のほか、SHOWを実行して表示される文字列の多くがメタデータに該当します。 INFORMATION_SCHEMAのテーブルコンテンツに関しても同様です。というのも、それらのテーブルにはデータベースオブジェクトに関する情報が含まれることが定義されているからです。

メタデータの表現は下記の要求を満たしていなければなりません。

  • すべてのメタデータはキャラクタセットが一致している必要があります。そうなっていない場合、SHOWコマンドやINFORMATION_SCHEMAのテーブルSELECTステートメントは正確には働きません。 なぜなら、これらの同じ演算結果カラムの文字列は、異なるキャラクタセットに存在するからです。

  • メタデータは全ての言語の全ての文字を含んでいる必要があります。そうなっていない場合、ユーザは各々の言語を使用してカラムとテーブルに名前をつけることはできません。

上記 2 つの要求を満たすために、MySQL ではメタデータが Unicode キャラクタセット(UTF8)で保存されます。これによって不具合が発生しないのは、アクセント付き文字を使用しない場合です。使用する場合、メタデータのキャラクタセットが UTF8 であることを認識する必要があります。

メタデータ要求は、USER()CURRENT_USER()SESSION_USER()SYSTEM_USER()DATABASE()、そしてVERSION()関数では、UTF-8キャラクターセットがデフォルトで使用されることを意味します。

サーバではcharacter_set_systemのシステム変数がメタデータキャラクタセットに名前をつけることができます。

mysql> SHOW VARIABLES LIKE 'character_set_system';
+----------------------+-------+
| Variable_name        | Value |
+----------------------+-------+
| character_set_system | utf8  |
+----------------------+-------+

Unicodeを用いたメタデータの保存は、サーバが、カラムのヘッダーやデフォルトのcharacter_set_systemキャラクタセット内の結果DESCRIBE 関数を返すということではありませんSELECT column1 FROM tを使用すると、column1の名前がそのままサーバから、character_set_resultsシステム変数値によって定義されるキャラクタセット(latin1のデフォルト値)のクライアントに返されます。異なるキャラクタセットでメタデータ結果をサーバから返してほしいときは、SET NAMESステートメントを使用してキャラクタセット変換を強制的に実行させましょう。SET NAMEScharacter_set_resultsと他の関連システム変数を設定します。(詳しくは項9.4. 「接続のキャラクタセットおよび照合順序」をご確認ください。)また、サーバから結果を受け取った後、クライアントプログラムが変換を実行することができます。クライアントが変換を実行するほうが効率的ですが、常にクライアントにオプション選択ができるわけではありません。

character_set_resultsNULLに設定されている場合、変換は実行されず、サーバはオリジナルのキャラクタセットを使用してメタデータを返します。(設定はcharacter_set_systemによって指定されます。

サーバからクライアントへのエラーメッセージは、自動的にメタデータとしてクライアントのキャラクタセットに変換されます。

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

SELECT * FROM Table1 WHERE USER() = latin1_column;

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

INSERT INTO Table1 (latin1_column) SELECT USER();

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

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

9.9. カラムキャラクタセット変換

特定のキャラクタセット使用のため、バイナリもしくはバイナリではない文字列カラムの変換にはALTER TABLEを使用してください。正確な変換のためには、以下の条件の内一つが適用されなければなりません。

  • カラムがバイナリデータ型(BINARYVARBINARYBLOB)である場合、含まれる全ての値は1つのキャラクタセット(カラムを変換しようとしているキャラクタセット)を使ってエンコードされている必要があります。バイナリカラムを使って複数のキャラクタセット情報を保存する場合、MySQLはどの値がどのキャラクタセットを使用するのか特定できず、データを正確に変換できません。

  • カラムにバイナリではないデータ型(CHARVARCHARTEXT)が存在する場合、内容は他のキャラクタセットではなく、カラムのキャラクタセットでエンコードされている必要があります。内容が他のキャラクタセットでエンコードされている場合、先にバイナリデータ型を使用するようカラムを変換して、望ましいキャラクタセットのバイナリでないカラムに変換することができます。

例えばテーブルtBINARY(50)として定義されているcol1というバイナリカラムだとします。カラムに含まれる情報が1つのキャラクタセットを使用してエンコードされていると想定して、キャラクタセットを持つバイナリでないカラムに変換することができます。例えば、col1 にはgreekの文字を表すキャラクタセットのバイナリデータが含まれる場合、以下のように変換できます。

ALTER TABLE t MODIFY col1 CHAR(50) CHARACTER SET greek;

例えばそのテーブルtcol1というCHAR(50) CHARACTER SET latin1と定義された、バイナリでないカラムを含むとします。utf8を使用し多言語からの値を保存するために変換したいとします。以下のステートメントはこれを実行します。

ALTER TABLE t MODIFY col1 CHAR(50) CHARACTER SET utf8;

カラムに、両キャラクタセットに含まれない文字がある場合、変換は正確に実行されません。

4.0もしくはそれ以前のバージョンから古いテーブルを使用する場合、特定のケースが生じます。ここでは、バイナリでないカラムは、サーバのデフォルトキャラクタセットと異なるキャラクタセットでエンコードされた値を含みます。例えば、MySQLのデフォルトキャラクタセットがlatin1であっても、アプリケーションはsjis値をカラムに保存します。適切なキャラクタセットを使用するために、カラムを変換することは可能ですが、追加ステップが必要となります。例えばサーバのデフォルトキャラクタセットがlatin1col1CHAR(50)と定義されているにもかかわらず、内容はsjis値とします。最初のステップは、バイナリデータ型にカラムを変換することで、既存のキャラクタセット情報を文字変換なしで取り除くことです。

ALTER TABLE t MODIFY col1 BINARY(50);

次のステップは適切なキャラクタセットを用いたバイナリでないデータ型にカラムを変換することです。:

ALTER TABLE t MODIFY col1 CHAR(50) CHARACTER SET sjis;

このプロシージャは、MySQL4.1もしくはそれ以降にアップグレード後、テーブルがINSERTUPDATEのようなステートメントで修正されていないことが求められます。 その場合、MySQL はlatin1を使い新しい値を保存し、カラムはsjislatin1値を同時に含んでおり、正確に変換することはできません。

最初にカラムを作成するときに属性を特定した場合、ALTER TABLEを使ってテーブルを変更しているときも属性を特定する必要があります。例えばNOT NULLと明示的なDEFAULT値を特定した場合、ALTER TABLEステートメントでも特定する必要があります。でなければ、結果のカラム定義にはそれらの属性が含まれません。

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

MySQL では、30 を超えるキャラクタセットに対して 70 を超える照合順序がサポートされています。このセクションではMySQLがどのキャラクタセットをサポートするかを示しています。関連するキャラクタセットごとに、1つのサブセクションがあります。各キャラクタセットに対して有効な照合順序がリストアップされています。

SHOW CHARACTER SET ステートメントを用いて、有効なキャラクタセットとそのデフォルトの照合順序を常に表示することができます。

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

9.10.1. Unicode キャラクタセット

MySQLにはキャラクタセットが 2 つ存在します。これらのキャラクタセットを使用し、約 650 の言語でテキストを保存することができます。

  • ucs2 (UCS-2 Unicode) 照合順序

    • ucs2_bin

    • ucs2_czech_ci

    • ucs2_danish_ci

    • ucs2_esperanto_ci

    • ucs2_estonian_ci

    • ucs2_general_ci (デフォルト)

    • ucs2_hungarian_ci

    • ucs2_icelandic_ci

    • ucs2_latvian_ci

    • ucs2_lithuanian_ci

    • ucs2_persian_ci

    • ucs2_polish_ci

    • ucs2_roman_ci

    • ucs2_romanian_ci

    • ucs2_slovak_ci

    • ucs2_slovenian_ci

    • ucs2_spanish2_ci

    • ucs2_spanish_ci

    • ucs2_swedish_ci

    • ucs2_turkish_ci

    • ucs2_unicode_ci

  • utf8 (UCS-8 Unicode) 照合順序

    • utf8_bin

    • utf8_czech_ci

    • utf8_danish_ci

    • utf8_esperanto_ci

    • utf8_estonian_ci

    • utf8_general_ci (デフォルト)

    • utf8_hungarian_ci

    • utf8_icelandic_ci

    • utf8_latvian_ci

    • utf8_lithuanian_ci

    • utf8_persian_ci

    • utf8_polish_ci

    • utf8_roman_ci

    • utf8_romanian_ci

    • utf8_slovak_ci

    • utf8_slovenian_ci

    • utf8_spanish2_ci

    • utf8_spanish_ci

    • utf8_swedish_ci

    • utf8_turkish_ci

    • utf8_unicode_ci

注:ucs2_roman_ciutf8_roman_ciの照合順序では、IJおよびUV は等価として比較されます。

ucs2_hungarian_ciutf8_hungarian_ci の照合順序はMySQL 5.1.5で追加されています。

MySQL はutf8_unicode_ci照合順序を、以下に示されるhttp://www.unicode.org/reports/tr10/Unicode 照合順序アルゴリズム(UCA) によって実行されます。照合順序ではバージョン-4.0.0 UCAのウェイトキーが使用されます。http://www.unicode.org/Public/UCA/4.0.0/allkeys-4.0.0.txt 以下ではutf8_unicode_ciを使用しますが、ucs2_unicode_ciに対しても有効です。

現在、utf8_unicode_ci照合順序はUnicode 照合順序アルゴリズムを部分的にのみサポートしています。中にはまだサポートされていない文字もあります。また、結合マークは完全にはサポートされていません。このことはベトナム語を中心に、ロシア内のマイノリティ言語に影響します。

utf8_unicode_ci主な特徴は、拡張をサポートしていることです。それは1つの文字が他の文字のコンビネーションと等価であると比較された場合です。例えば、ドイツ語や他の言語では、‘s’ は‘ss’に相当します。

utf8_general_ciは拡張をサポートしないレガシー照合順序です。文字間で1対1の比較しかできません。つまり、utf8_general_ci照合順序に対する比較の方が早いが、utf8_unicode_ciに比べてわずかに正確性が劣ります。

例えば、以下の等式がutf8_general_ciutf8_unicode_ciにおいて証明されます。

A = A
O = O
U = U

照合順序間の違いはutf8_general_ciに対して有効です。

s = s

utf8_unicode_ciにとって有効である場合:

s = ss

MySQL がutf8キャラクタセットに対する特定言語の照合順序を実行するのはutf8_unicode_ci内での順序が言語に対してうまく機能しないときだけです。 例えば、utf8_unicode_ciはドイツ語とフランス語では正しく機能するので、これら2言語に対する特定のutf8照合順序を作成する必要はありません。

utf8_general_ciもドイツ語・フランス語ともに有効ですが、ただし‘s’は‘s’と等価であり、‘ss’と等価ではありません。これが使用しているアプリケーションに対して可能な場合、utf8_general_ciの方が早いのでこちらをお勧めします。それ以外の場合、utf8_unicode_ciを使うほうがより正確です。

utf8_swedish_ciは他のutf8 特定言語の照合順序のように、追加言語ルールとともにutf8_unicode_ciから由来します。例えば、スウェーデン語ではドイツ語やフランス語を使用するユーザでは予期しないような以下の関係が有効です

U = Y < O

utf8_spanish_ciutf8_spanish2_ci照合順序は現代スペイン語および従来のスペイン語に対しても同様に対応します。両照合順序において‘n’ (n-tilde)は、 ‘n’や‘o’とは区別すべき文字です。さらに従来のスペイン語では‘ch’ は‘c’と‘d’は区別すべき文字であり、‘ll’は‘l’と‘m’とも区別すべき文字です。

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

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

  • ascii (US ASCII) 照合順序:

    • ascii_bin

    • ascii_general_ci (デフォルト)

  • cp850 (DOS 西ヨーロッパ言語) 照合順序:

    • cp850_bin

    • cp850_general_ci (デフォルト)

  • dec8 (DEC 西ヨーロッパ言語) 照合順序:

    • dec8_bin

    • dec8_swedish_ci (デフォルト)

  • hp8 (HP 西ヨーロッパ言語) 照合順序:

    • hp8_bin

    • hp8_english_ci (デフォルト)

  • latin1 (cp1252 西ヨーロッパ言語) 照合順序:

    • latin1_bin

    • latin1_danish_ci

    • latin1_general_ci

    • latin1_general_cs

    • latin1_german1_ci

    • latin1_german2_ci

    • latin1_spanish_ci

    • latin1_swedish_ci (デフォルト)

    latin1 はデフォルトキャラクタセットです。MySQLのlatin1 はWindowscp1252キャラクタセットと同じです。つまり公式ISO 8859-1 あるいはIANA (アイアナ) latin1と同様ですが、アイアナlatin10x800x9f間のコードポイントは「定義されていません」。 これに対して、cp1252、つまりMySQLのlatin1はそれらポジションに対して文字を指定しています。例えば 0x80 はユーロのサインです。cp1252の「定義されていない」エントリーでは、MySQLは0x81 をUnicode 0x00810x8d0x008d0x8f0x008f0x900x0090そして0x9d0x009dに変換します。

    latin1_swedish_ci照合順序は大部分のMySQLカスタマに使用されているデフォルトです。スウェーデン語/フィンランド語の照合順序ルールに基づいているとされていますが、スウェーデン人やフィンランド人の中にはこのステートメントに賛成しない人もいます。

    latin1_german1_cilatin1_german2_ci照合順序はDIN-1 およびDIN-2 標準に基づいて、DINはDeutsches Institut fur Normung (アンシーのドイツ版)を表しています。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
      

    latin1_spanish_ci 照合順序では、 ‘n’ (n-tilde) は‘n’と‘o’とは区別されます。

  • macroman (Mac 西ヨーロッパ言語) 照合順序:

    • macroman_bin

    • macroman_general_ci (デフォルト)

  • swe7 (7bit Swedish) 照合順序:

    • swe7_bin

    • swe7_swedish_ci (デフォルト)

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

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

  • cp1250 (Windows 中央ヨーロッパ言語) 照合順序:

    • cp1250_bin

    • cp1250_croatian_ci

    • cp1250_czech_cs

    • cp1250_general_ci (デフォルト)

    • cp1250_polish_ci

  • cp852 (DOS 中央ヨーロッパ言語) 照合順序:

    • cp852_bin

    • cp852_general_ci (デフォルト)

  • keybcs2 (DOS Kamenicky Czech-Slovak) 照合順序:

    • keybcs2_bin

    • keybcs2_general_ci (デフォルト)

  • latin2 (ISO 8859-2 中央ヨーロッパ言語) 照合順序:

    • latin2_bin

    • latin2_croatian_ci

    • latin2_czech_cs

    • latin2_general_ci (デフォルト)

    • latin2_hungarian_ci

  • macce (Mac 中央ヨーロッパ言語) 照合順序:

    • macce_bin

    • macce_general_ci (デフォルト)

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

MySQLでは南ヨーロッパや中東、アルメニア語、アラビア語、グルジア語、ギリシャ語、ヘブライ語、トルコ語のキャラクタセットがサポートされています。

  • armscii8 (ARMSCII-8 Armenian) 照合順序:

    • armscii8_bin

    • armscii8_general_ci (デフォルト)

  • cp1256 (Windows アラビア語) 照合順序:

    • cp1256_bin

    • cp1256_general_ci (デフォルト)

  • geostd8 (GEOSTD8 Georgian) 照合順序:

    • geostd8_bin

    • geostd8_general_ci (デフォルト)

  • greek (ISO 8859-7 ギリシャ語) 照合順序:

    • greek_bin

    • greek_general_ci (デフォルト)

  • hebrew (ISO 8859-8 ヘブライ語) 照合順序:

    • hebrew_bin

    • hebrew_general_ci (デフォルト)

  • latin5 (ISO 8859-9 トルコ語) 照合順序:

    • latin5_bin

    • latin5_turkish_ci (デフォルト)

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

バルト語に含まれるキャラクタセットにはエストニア語、ラトビア語、そしてリトアニア言語が含まれます。

  • cp1257 (Windows バルト語) 照合順序:

    • cp1257_bin

    • cp1257_general_ci (デフォルト)

    • cp1257_lithuanian_ci

  • latin7 (ISO 8859-13 バルト語) 照合順序:

    • latin7_bin

    • latin7_estonian_cs

    • latin7_general_ci (デフォルト)

    • latin7_general_cs

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

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

  • cp1251 (Windows キリル語) 照合順序:

    • cp1251_bin

    • cp1251_bulgarian_ci

    • cp1251_general_ci (デフォルト)

    • cp1251_general_cs

    • cp1251_ukrainian_ci

  • cp866 (DOS ロシア語) 照合順序:

    • cp866_bin

    • cp866_general_ci (デフォルト)

  • koi8r (KOI8-R Relcom Russian) 照合順序:

    • koi8r_bin

    • koi8r_general_ci (デフォルト)

  • koi8u (KOI8-U ウクライナ語) 照合順序:

    • koi8u_bin

    • koi8u_general_ci (デフォルト)

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

サポートされているアジアのキャラクタセットには、中国語、日本語、韓国語、タイ語が含まれています。これらは複雑な場合があります。たとえば、中国語のキャラクタセットは数千種類の文字に対応していなければなりません。 cp932 およびsjisキャラクタセットについてのさらに詳しい情報は次を参照してください。項9.10.7.1. 「cp932のキャラクタセット」

MySQLのアジアのキャラクタセットに関する一般的な質問や問題のサポートについては、次を参照してください。項A.12. 「MySQL 5.1 FAQ ? MySQL Chinese, Japanese, and Korean Character Sets」

  • big5 (Big5 Traditional Chinese) 照合順序:

    • big5_bin

    • big5_chinese_ci (デフォルト)

  • cp932 (SJIS for Windows Japanese) 照合順序:

    • cp932_bin

    • cp932_japanese_ci (デフォルト)

  • eucjpms (UJIS for Windows Japanese) 照合順序:

    • eucjpms_bin

    • eucjpms_japanese_ci (デフォルト)

  • euckr (EUC-KR Korean) 照合順序:

    • euckr_bin

    • euckr_korean_ci (デフォルト)

  • gb2312 (GB2312 Simplified Chinese) 照合順序:

    • gb2312_bin

    • gb2312_chinese_ci (デフォルト)

  • gbk (GBK Simplified Chinese) 照合順序:

    • gbk_bin

    • gbk_chinese_ci (デフォルト)

  • sjis (Shift-JIS Japanese) 照合順序:

    • sjis_bin

    • sjis_japanese_ci (デフォルト)

  • tis620 (TIS620 Thai) 照合順序:

    • tis620_bin

    • tis620_thai_ci (デフォルト)

  • ujis (EUC-JP Japanese) 照合順序:

    • ujis_bin

    • ujis_japanese_ci (デフォルト)

9.10.7.1. cp932のキャラクタセット

なぜcp932は必要なのでしょうか。

MySQLではsjis キャラクタセットはアイアナで定義されるShift_JISキャラクタセットに対応しており、これらはJIS X0201およびJIS X0208キャラクタセットをサポートしています。(詳しくはhttp://www.iana.org/assignments/character-setsをご確認ください。)

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

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

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

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

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

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

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

MySQLのcp932キャラクタセットはこれらの問題を解決するよう デザインされています。

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拡張文字のコードポイントを使用します。

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

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

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

いくつかの文字については、sjiscp932.でucs2との変換ルールが異なります。以下のテーブルはこれらの違いを例示したものです。

ucs2への変換:

sjis/cp932sjis -> ucs2 変換cp932 -> ucs2 変換
5C005C005C
7E007E007E
815C20152015
815F005CFF3C
8160301CFF5E
816120162225
817C2212FF0D
819100A2FFE0
819200A3FFE1
81CA00ACFFE2

ucs2からの変換:

ucs2ucs2 -> sjis 変換ucs2 -> cp932 変換
005C815F5C
007E7E7E
00A281913F
00A381923F
00AC81CA3F
2015815C815C
201681613F
2212817C3F
22253F8161
301C81603F
FF0D3F817C
FF3C3F815F
FF5E3F8160
FFE03F8191
FFE13F8192
FFE23F81CA

日本語キャラクタセットのユーザーは--character-set-client-handshake(もしくは --skip-character-set-client-handshake)を使うことで重要な効果があることに注意しなければなりません。詳しくは項4.2.2. 「コマンド オプション」を参照してください。

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