MySQL 8.0 リファレンスマニュアル


10.10.7.1 cp932 文字セット

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_JIScp932 を 2 つの異なる文字セットに区分することが重要になります。

cp932sjis との相違点

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 との間の変換は、sjiscp932 との場合と異なります。 次の表に、これらの違いを示します。

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


関連キーワード:  文字, セット, 照合, 順序, 変換, サポート, 拡張, バイト, 選定, goglobal