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