なぜ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. 「コマンド オプション」を参照してください。
