目次
COLLATE
節COLLATE
節の優先順位BINARY
演算子MySQL バージョン 4.1 の追加機能の 1 つとして、キャラクタセットの処理が改善されたことがあげられます。この章では、以下について説明します。
キャラクタセットと照合順序とは
マルチレベルデフォルトシステム
MySQL 4.1 での新しい構文
影響を受ける関数と演算
個別のキャラクタセットと照合順序の意味
ここでは、MySQL 4.1.1 での実装に基づき機能を説明します (MySQL 4.1.0 には、これらの機能の全部ではなく一部のみが存在します。また、実装が異なっている機能もあります)。
キャラクタセットとは、シンボルとエンコードのセットです。照合順序とは、キャラクタセット内の文字を比較するためのルールを集めたものです。架空のキャラクタセットを例にして、キャラクタセットと照合順序の違いを見てみましょう。
次の 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 に大きく差をつけています。ただし、新機能を効率的に使用するには、利用可能なキャラクタセット、各デフォルトの変更方法、各種の列演算子による処理内容を知っておかなければなりません。
キャラクタセットには、少なくとも 1 つの照合順序が含まれており、複数の照合順序が含まれていることもあります。
たとえば、キャラクタセット
latin1
(``ISO-8859-1
西ヨーロッパ言語'')には以下の照合順序が含まれています。
照合順序 | 意味 |
latin1_bin | latin1 エンコードに基づくバイナリ |
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
(バイナリ)のいずれかで終わる。
COLLATE
節COLLATE
節の優先順位BINARY
演算子サーバ、データベース、テーブル、接続の 4 段階で、キャラクタセットと照合順序のデフォルト設定が用意されています。以下の説明は複雑に見えるかもしれませんが、マルチレベルのデフォルト設定では自然かつ明確な結果を得られることが実際に判明しています。
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-collation
を
configure
の引数として使用してください。例:
shell> ./configure --with-character-set=latin1
または
shell> ./configure --with-character-set=latin1
--with-collation=latin1_german1_ci
mysqld
と configure
では、キャラクタセットと照合順序の有効性がチェックされます。組み合わせが有効でない場合、各プログラムによってエラーメッセージが表示され、強制終了されます。
各データベースにはデータベースキャラクタセットとデータベース照合順序があり、いずれもヌルにすることはできません。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 X
と COLLATE
Y
の両方を指定した場合は、キャラクタセット
X
と照合順序 Y
。
CHARACTER SET X
を指定し、COLLATE
を指定しなかった場合は、キャラクタセット
X
とそのデフォルト照合順序。
その他の場合は、サーバキャラクタセットとサーバ照合順序。
MySQL の CREATE DATABASE ... DEFAULT CHARACTER SET
...
構文は標準 SQL CREATE SCHEMA ...
CHARACTER SET ...
構文に類似しています。このため、キャラクタセットと照合順序が異なる複数のデータベースを同一の
MySQL サーバ上に作成することができます。
テーブルのキャラクタセットと照合順序が
CREATE TABLE
ステートメントに指定されていない場合、データベースのキャラクタセットと照合順序はデフォルト値として使用されます。これらに他の用途はありません。
各テーブルにはテーブルキャラクタセットとテーブル照合順序があり、いずれもヌルにすることはできません。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 X
と COLLATE
Y
の両方を指定した場合は、キャラクタセット
X
と照合順序 Y
。
CHARACTER SET X
を指定し、COLLATE
を指定しなかった場合は、キャラクタセット
X
とそのデフォルト照合順序。
その他の場合は、データベースキャラクタセットとデータベース照合順序。
カラムのキャラクタセットと照合順序が個別のカラム定義に指定されていない場合、テーブルのキャラクタセットと照合順序はデフォルト値として使用されます。テーブルのキャラクタセットと照合順序は MySQL 拡張であり、同等の機能は標準 SQL に存在しません。
各 ``文字''
カラム(CHAR
、VARCHAR
または
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 X
と COLLATE
Y
の両方を指定した場合は、キャラクタセット
X
と照合順序 Y
。
CHARACTER SET X
を指定し、COLLATE
を指定しなかった場合は、キャラクタセット
X
とそのデフォルト照合順序。
その他の場合は、テーブルキャラクタセットとテーブル照合順序。
CHARACTER SET
および
COLLATE
節は標準 SQL です。
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
となります。
各接続には接続キャラクタセットと接続照合順序があり、いずれもヌルにすることはできません。実際には 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
ステートメントを使用する際にどのキャラクタセットでカラムに値が保持されるかを示します。
例:column1
が CHAR(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
各文字列リテラルにはキャラクタセットと照合順序があり、いずれもヌルにすることはできません。
文字列リテラルでは、オプションとしてキャラクタセットイントロデューサと
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 では、リテラルのキャラクタセットおよび照合順序が次のように決定されます。
_X
と COLLATE 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
の指定に基づき実装されます。
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;
COLLATE
節は優先順位が高い(||
よりも上)ので、式
x || y COLLATE z
は以下と同じ意味になります。
x || (y COLLATE z)
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;
注意:どのキャラクタセットにもバイナリ照合順序があります。
大多数のクエリでは、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 | エラー |
各キャラクタセットには 1
つ以上の照合順序があり、各照合順序は 1
つのキャラクタセットに関連付けられていることを思い出してください。したがって、次のステートメントはエラーになります。latin2_bin
照合順序は latin1
キャラクタセットに対して有効でないからです。
mysql> SELECT _latin1 'x' COLLATE latin2_bin;
ERROR 1251: COLLATION 'latin2_bin' is not valid
for CHARACTER SET 'latin1'
テーブル T
のカラム
X
に以下の latin1
カラムの値が設定されているとします。
Muffler Muller MX Systems MySQL
さらに、以下のステートメントを使用してカラムの値を取得したとします。
SELECT X FROM T ORDER BY X COLLATE collation_name;
異なった照合順序に対する値の順序は以下のようになります。
latin1_swedish_ci | latin1_german1_ci | latin1_german2_ci |
Muffler | Muffler | Muller |
MX Systems | Muller | Muffler |
Muller | MX Systems | MX Systems |
MySQL | MySQL | MySQL |
この表は、複数の異なった照合順序を
ORDER BY
節で使用した結果の一例です。この例では、2
個の点が上に付いている U
が問題の原因です。この文字をドイツではウムラウトと呼んでいますが、私たちは分音記号付きの
U と呼んでいます。
最初のカラムには、スウェーデン語/フィンランド語の照合ルールを使用したSELECT
の結果が示されています。この照合ルールによると、分音記号付きの
U は Y と一致します。
2 番目のカラムには、ドイツ語の DIN-1
ルールを使用した SELECT
の結果が示されています。このルールによると、分音記号付きの
U は U と一致します。
3 番目のカラムには、ドイツ語の DIN-2
ルールを使用したSELECT
の結果が示されています。このルールによると、分音記号付きの
U は UE と一致します。
3 つの異なった照合順序が、3 つの異なった結果をもたらしています。これこそ正に MySQL で対処すべき状況です。適切な照合順序を使用すると、任意のソート順序を選択できます。
このセクションでは、キャラクタセット情報を計算に入れる演算について説明します。
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 X
と
COLLATE 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()
。
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
の仕様に基づき実装されています。
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
のデフォルト照合順序になります。
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
文字を格納するための最大バイト数を示します。
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
は、キャラクタセットでソート文字列を表現するために必要なメモリの容量に関連します。
以下のクエリは、指定されたデータベースを作成する
CREATE DATABASE
ステートメントを示します。実行結果には、データベースオプションがすべて含まれています。DEFAULT
CHARACTER SET
と COLLATE
がサポートされています。データベースオプションがすべて保存されている単一のテキストファイルがデータベースディレクトリにあります。
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)
SHOW COLUMNS
ステートメントを
SHOW FULL COLUMNS
として呼び出したときは、テーブルのカラムの照合順序を示します。
データ型が
CHAR
、VARCHAR
、TEXT
のいずれかであるカラムは、照合順序が
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)
キャラクタセットは表示対象に含まれていません。
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 バイトであるためです。
メタデータとは、データについてのデータです。データベースの内容となっているデータではなく、データベースについて説明するデータがメタデータです。したがって、カラム名、データベース名、ユーザ名、バージョン名のほか、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
になります。クライアントのキャラクタセットへの変換は、メタデータに関しては自動的に行われます。結果セットを返す場合のデフォルトの動作を変更することができます。
SAP DB の互換性に関し、以下の 2 つのステートメントは同じです。
CREATE TABLE t1 (f1 CHAR(n) UNICODE); CREATE TABLE t1 (f1 CHAR(n) CHARACTER SET ucs2);
MySQL 4.1 の場合、キャラクタセットの設定は XML
ファイルに保存されます。キャラクタセットごとに
1
ファイルが使用されます(以前のバージョンでは、キャラクタセット設定情報は
.conf
ファイルに保存されました)。
MySQL-4.x
とそれ以前のバージョンでは、NCHAR
と CHAR
は同義語でした。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';
ここでは、旧バージョンの MySQL からのアップグレードについて説明します。MySQL 4.1 では、MySQL 4.0 との上位互換性がほぼ完全に確保されており、その理由は単に機能の大半が新しい点にあります。したがって、コンフリクトを引き起こす要素は旧バージョンに存在しません。ただし、相違点と注意点がいくつかあります。
最重要:``MySQL 4.0 キャラクタセット'' には、``MySQL 4.1 キャラクタセット'' と ``MySQL 4.1 照合順序'' の両方の特性が含まれています。しかし、これを覚えておく必要はありません。今後は、同じ複合オブジェクト内でキャラクタセットまたは照合順序特性を並存させない予定です。
MySQL
には各国キャラクタセットに関する特別な処理が用意されています。
4.1. NCHAR
は CHAR
と同じではなく、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 キャラクタセット/照合順序のペアを検索します。
ID | 4.0 キャラクタセット | 4.1 キャラクタセット | 4.1 照合順序 |
1 | big5 | big5 | big5_chinese_ci |
2 | czech | latin2 | latin2_czech_ci |
3 | dec8 | dec8 | dec8_swedish_ci |
4 | dos | cp850 | cp850_general_ci |
5 | german1 | latin1 | latin1_german1_ci |
6 | hp8 | hp8 | hp8_english_ci |
7 | koi8_ru | koi8r | koi8r_general_ci |
8 | latin1 | latin1 | latin1_swedish_ci |
9 | latin2 | latin2 | latin2_general_ci |
10 | swe7 | swe7 | swe7_swedish_ci |
11 | usa7 | ascii | ascii_general_ci |
12 | ujis | ujis | ujis_japanese_ci |
13 | sjis | sjis | sjis_japanese_ci |
14 | cp1251 | cp1251 | cp1251_bulgarian_ci |
15 | danish | latin1 | latin1_danish_ci |
16 | hebrew | hebrew | hebrew_general_ci |
17 | win1251 | (removed) | (removed) |
18 | tis620 | tis620 | tis620_thai_ci |
19 | euc_kr | euckr | euckr_korean_ci |
20 | estonia | latin7 | latin7_estonian_ci |
21 | hungarian | latin2 | latin2_hungarian_ci |
22 | koi8_ukr | koi8u | koi8u_ukrainian_ci |
23 | win1251ukr | cp1251 | cp1251_ukrainian_ci |
24 | gb2312 | gb2312 | gb2312_chinese_ci |
25 | greek | greek | greek_general_ci |
26 | win1250 | cp1250 | cp1250_general_ci |
27 | croat | latin2 | latin2_croatian_ci |
28 | gbk | gbk | gbk_chinese_ci |
29 | cp1257 | cp1257 | cp1257_lithuanian_ci |
30 | latin5 | latin5 | latin5_turkish_ci |
31 | latin1_de | latin1 | latin1_german2_ci |
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)
注意:すべてのキャラクタセットにバイナリ照合順序が存在します。ただし、以降の説明ではバイナリ照合順序について取り上げていないこともあります。
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 | +---------+-----------------+-------------------+--------+
+----------+-----------------------------+---------------------+--------+ | Charset | Description | Default collation | Maxlen | +----------+-----------------------------+---------------------+--------+ | dec8 | DEC West European | dec8_swedish_ci | 1 | | hp8 | HP West European | hp8_english_ci | 1 | +----------+-----------------------------+---------------------+--------+
+----------+-----------------------------+---------------------+--------+ | 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 | +----------+-----------------------------+---------------------+--------+
サポートされているアジアのキャラクタセットには、中国語、日本語、韓国語、タイ語が含まれています。これらは複雑な場合があります。たとえば、中国語のキャラクタセットは数千種類の文字に対応していなければなりません。
+----------+-----------------------------+---------------------+--------+ | 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 | +----------+-----------------------------+---------------------+--------+
なぜ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_JIS
とcp932
を二種類の
キャラクターセットとして区別することが重要となります。
cp932
はsjis
とどう異なるか
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コードポイントを表示する。
NEC特殊文字:
http://www.microsoft.com/globaldev/reference/dbcs/932/932_87.htm
NEC選定IBM拡張文字:
http://www.microsoft.com/globaldev/reference/dbcs/932/932_ED.htm http://www.microsoft.com/globaldev/reference/dbcs/932/932_EE.htm
IBM拡張文字:
http://www.microsoft.com/globaldev/reference/dbcs/932/932_FA.htm http://www.microsoft.com/globaldev/reference/dbcs/932/932_FB.htm http://www.microsoft.com/globaldev/reference/dbcs/932/932_FC.htm
5.0.3以降では、eucjpms
キャラクターセットと組み合わせて
使用することで、
cp932
でユーザー定義文字の変換がサポートされ、
sjis
/ujis
間での変換問題にも対応している。
詳細はhttp://www.opengroup.or.jp/jvc/cde/sjis-euc-e.htmlを参照のこと。
いくつかの文字については、sjis
とcp932
で
ucs2
との変換ルールが異なる。以下の表ではその違いを説明している。
ucs2
への変換
sjis /cp932
のコードポイント | sjis →
ucs2 変換 | cp932 →
ucs2 変換 |
5C | 005C | 005C |
7E | 007E | 007E |
815C | 2015 | 2015 |
815F | 005C | FF3C |
8160 | 301C | FF5E |
8161 | 2016 | 2225 |
817C | 2212 | FF0D |
8191 | 00A2 | FFE0 |
8192 | 00A3 | FFE1 |
81CA | 00AC | FFE2 |
ucs2
からの変換:
ucs2
のコードポイント | ucs2 →
sjis 変換 | ucs2 →
cp932 変換 |
005C | 815F | 5C |
007E | 7E | 7E |
00A2 | 8191 | 3F |
00A3 | 8192 | 3F |
00AC | 81CA | 3F |
2015 | 815C | 815C |
2016 | 8161 | 3F |
2212 | 817C | 3F |
2225 | 3F | 8161 |
301C | 8160 | 3F |
FF0D | 3F | 817C |
FF3C | 3F | 815F |
FF5E | 3F | 8160 |
FFE0 | 3F | 8191 |
FFE1 | 3F | 8192 |
FFE2 | 3F | 81CA |
バルト語キャラクタセットには、エストニア語、ラトビア語、リトアニア語が含まれています。現在サポートされているバルト語キャラクタセットは以下の 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 | +----------------------+----------+----+---------+----------+---------+
ベラルーシ語、ブルガリア語、ロシア語、ウクライナ語と共に使用するキリル語のキャラクタセットおよび照合順序を以下に示します。
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 | +----------------------+----------+----+---------+----------+---------+
チェコ、スロバキア、ハンガリー、ルーマニア、スロベニア、クロアチア、ポーランドで使用されるキャラクタセットも一部サポートされています。
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 | +----------------------+----------+----+---------+----------+---------+
西ヨーロッパのキャラクタセットには、大部分の西ヨーロッパ言語(フランス語、スペイン語、カタロニア語、バスク語、ポルトガル語、イタリア語、アルバニア語、オランダ語、ドイツ語、デンマーク語、スウェーデン語、ノルウェー語、フィンランド語、フェロー語、アイスランド語、アイルランド語、スコットランド語、英語など)が含まれています。
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.