なぜ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 |
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.
