cp932
が必要な理由
MySQL では sjis
文字セットは IANA で定義される Shift_JIS
文字セットに対応しており、これらは JIS X0201 および JIS X0208 文字セットをサポートしています。 (http://www.iana.org/assignments/character-setsを参照してください。)
ただし、記述用語としての「SHIFT JIS」の意味は非常にあいまいになっており、さまざまなベンダーが定義した Shift_JIS
に対する拡張も含める場合もあります。
たとえば、日本語 Windows 環境で使用される「SHIFT JIS」は、Microsoft による Shift_JIS
の拡張であり、正式な名称は Microsoft Windows Codepage : 932
または cp932
です。 Shift_JIS
でサポートされる文字に加え、cp932
では、NEC 特殊文字、NEC 選定 IBM 拡張文字、IBM 選定文字などの拡張文字をサポートします。
多くの日本語ユーザーは、これらの拡張文字を使用するときに問題に直面してきました。 これらの問題は次の要因によって生じていました。
MySQL が自動的に文字セットの変換を行なっていること。
文字セットが Unicode (
ucs2
) を使用して変換されていること。sjis
文字セットが、これらの拡張文字の変換をサポートしていないこと。いわゆる「SHIFT JIS」から Unicode への変換には複数の変換ルールが存在し、文字によっては、変換ルールに従って別々に Unicode に変換される場合があること。 MySQL ではこれらの変換ルールのうち、1 つしかサポートしていません (詳細は後述します)。
MySQL の cp932
文字セットは、これらの問題を解決するように設計されています。
MySQL が文字セットの変換をサポートするので、異なる変換ルールを持つ IANA の Shift_JIS
と cp932
を 2 つの異なる文字セットに区分することが重要になります。
cp932
と sjis
との相違点
cp932
文字セットは次の点で sjis
と異なります。
cp932
は、NEC 特殊文字、NEC 選定 IBM 拡張文字、IBM 選定文字をサポートします。-
一部の
cp932
文字には、2 つの異なるコードポイントがあり、両方とも同一の Unicode コードポイントに変換されます。 Unicode からcp932
に戻すときに、どちらかのコードポイントを選択する必要があります。 この「ラウンドトリップ変換」については、Microsoft が推奨するルールが使用されます。 (http://support.microsoft.com/kb/170559/EN-US/を参照してください。)この変換ルールは次のように機能します。
文字が JIS X 0208 文字と NEC 特殊文字の両方に存在する場合には、JIS X 0208 のコードポイントを使用します。
文字が NEC 特殊文字と IBM 選定文字の両方に存在する場合には、NEC 特殊文字のコードポイントを使用します。
文字が IBM 選定文字と NEC 選定 IBM 拡張文字の両方に存在する場合は、IBM 拡張文字のコードポイントを使用します。
https://msdn.microsoft.com/en-us/goglobal/cc305152.aspx に示す表には、
cp932
文字の Unicode 値に関する情報が記載されています。cp932
の表で下に 4 桁の数字が表示されている項目については、その数字は対応する Unicode (ucs2
) エンコーディングを表します。 下線付きの 2 桁の値のある表項目では、これらの 2 桁の値で始まる一定範囲のcp932
文字があります。 このような表項目をクリックすると、これらの桁の値で始まるcp932
文字対する各 Unicode 値を示したページが表示されます。詳細は次のリンクを参照してください。 それぞれ、次の文字セットのエンコーディングに対応します。
-
NEC 特殊文字 (先頭バイト
0x87
):https://msdn.microsoft.com/en-us/goglobal/gg674964
-
NEC 選択 -IBM 拡張文字 (リードバイト
0xED
および0xEE
):https://msdn.microsoft.com/en-us/goglobal/gg671837 https://msdn.microsoft.com/en-us/goglobal/gg671838
-
IBM が選択した文字 (リードバイト
0xFA
,0xFB
,0xFC
):https://msdn.microsoft.com/en-us/goglobal/gg671839 https://msdn.microsoft.com/en-us/goglobal/gg671840 https://msdn.microsoft.com/en-us/goglobal/gg671841
cp932
は、eucjpms
と組み合わせて使用することで、ユーザー定義の文字の変換をサポートし、sjis
/ujis
の変換での問題に対応します。 詳細は、http://www.sljfaq.org/afaq/encodings.htmlを参照してください。
一部の文字については、ucs2
との間の変換は、sjis
と cp932
との場合と異なります。 次の表に、これらの違いを示します。
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
) を使用すると大きな効果が得られることに注意してください。 セクション5.1.7「サーバーコマンドオプション」を参照してください。