なぜ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_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拡張文字のコードポイントを使用します。
http://www.microsoft.com/globaldev/reference/dbcs/932.htmで表示されるテーブルはcp932
文字のUnicodeポイントに関する情報です。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
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 |
日本語キャラクタセットのユーザーは--character-set-client-handshake
(もしくは
--skip-character-set-client-handshake
)を使うことで重要な効果があることに注意しなければなりません。詳しくは項4.2.2. 「コマンド オプション」を参照してください。