Japan MySQL Partners Association ロゴ 日本MySQLパートナー会MySQL AB
   トップページ | プレスリリース/イベント | ダウンロード | パートナー紹介 | 技術情報/開発事例 | 商品のご紹介 | ライセンスについて | ユーザ会 | 関連リンク
   問い合わせ先 | 日本MySQLパートナー会とは | 入会案内 | 役員名簿 | 組織図 | 著作権 | プライバシーポリシー
技術情報/開発事例
  ←戻る
■新キャラクタセット cp932 / eucjpms
MySQL-5.0.3-alphaより追加された新しいキャラクタセット「cp932」、及び「eucjpms」

MySQL-5.0.3-alphaより、新しいキャラクタセット「cp932」、及び「eucjpms」が追加されました。以下ではこの新しいキャラクタセットが追加された背景、及びその特徴を解説していきます。
1. 背景 - 従来の問題点

   1.1 MySQLのsjis

MySQLでサポートされている主な日本語キャラクタセットの一つとしてsjisがあります。これはIANA(Internet Assigned Numbers Authority)にShift_JISという名称で登録されているキャラクタセットに対応しています。このキャラクタセットがカバーしている文字はjisx0201、jix0208の文字集合です。よって、NEC特殊文字、NEC選定IBM拡張文字、IBM拡張文字(以降ベンダ定義文字)はShift_JISの範囲外の文字であり、MySQLのsjisでは正式には対応していません。

しかしながら、一般的にシフトJISと呼ばれている言葉の解釈がMySQLでの日本語の使用にあたって多くの誤解を招いていました。というのも、IANAに登録されているShift_JIS以外にも各ベンダがこのShift_JISを独自に拡張したものが各種存在し、それらが全てシフトJISという名称で一般化されてしまっているからです。特に日本語版Windows環境でシフトJISと呼ばれているものはShift_JISをマイクロソフト社が独自に拡張した文字が含まれており、厳密には正規のShift_JISとは異なるのです。このキャラクタセットは、Shift_JISで対応している文字集合に上記ベンダ定義文字を追加し、マイクロソフト社がMicrosoft Windows Codepage : 932として定義しています(以降、cp932)。なお、IANAにはWindows-31Jという名称でShift_JISとは別のキャラクタセットとして登録されています。シフトJISという公式ではない名称が氾濫している為Shift_JISとcp932は混同されがちですが、これら2つは別のキャラクタセットであり、 MySQLのsjisはShift_JISに対応していることを留意する必要があります。

表1 - sjis とcp932の比較
sjis
cp932
JISX0201*1
JISX0201
JISX0208*2
JISX0208

NEC 特殊文字
NEC選定IBM特殊文字
IBM特殊文字

*1 JISX0201: JISローマ字、半角カナ文字
*2 JISX0208: 記号類、全角数字、ラテン文字、平仮名、片仮名、ギリシャ文字、キリル文字、罫線、JIS第一水準漢字、JIS第二水準漢字、他


  1.2 キャラクタセットの自動変換

キャラクタセットsjisでは定義されていないベンダ定義文字とUnicode間のマッピングが、キャラクタセットcp932では定義されています*3。同時に、キャラクタセットujisを拡張し、ベンダ定義文字のUnicodeへのマッピングを定義したキャラクタセットeucjpmsも追加しています*4。これによって、従来sjis - ujis間ではできなかったベンダ定義文字の変換がcp932-eucjpms間であれば可能になります。

   ・クライアント側のキャラクタセットとテーブルのキャラクタセットが異なる場合には
    テーブルのキャラクタセットに合わせて、自動的にキャラクタセット変換が自動的に行われる
   ・キャラクタセット変換はUnicode(ucs2)を介して行われる
   ・Unicodeに変換する際のマッピングは各キャラクタセットごとに個別に定義されている

ここで問題になるのがベンダ定義文字の変換なのですが、先に述べた「MySQLのsjisはベンダ定義文字に正式には対応いない」というのは厳密に言うと、Unicodeへのマッピングが定義されていないということを意味します。つまり、キャラクタセットの変換はUnicodeを介して行われるのに、Unicodeへのマッピングが定義されていないため、ベンダ定義文字のキャラクタセット変換が発生すると正しく変換できず、文字化けが起こってしまうのです。
2. 新キャラクタセットの特徴

上記の問題を解決すべく新しく導入されたキャラクタセットがcp932、及びeucjpmsです。以下にこれらキャラクタセットの特徴を紹介します。

   2.1 ベンダ定義文字とUnicode間のマッピング定義

MySQLでサポートされている主な日本語キャラクタセットの一つとしてsjisがあります。これはIANA(Internet Assigned Numbers Authority)にShift_JISという名称で登録されているキャラクタセットに対応しています。このキャラクタセットがカバーしている文字はjisx0201、jix0208の文字集合です。よって、NEC特殊文字、NEC選定IBM拡張文字、IBM拡張文字(以降ベンダ定義文字)はShift_JISの範囲外の文字であり、MySQLのsjisでは正式には対応していません。

なお、cp932(eucjpms)に含まれる文字集合には異なるコードポイントに重複した文字が割り当てられている為、Unicodeからcp932(eucjpms)に戻す場合にどちらのコードポイントを使うかが問題になります。ここでは、マイクロソフト社のサポートオンラインで提示されている方法に従い、以下の通りに変換しています。

* JISX0208とNEC特殊文字が重複している場合にはJISX0208のコードポイントを選択する
* NEC特殊文字とIBM拡張文字が重複している場合にはNEC特殊文字のコードポイントを選択する
* IBM拡張文字とNEC選定IBM拡張文字が重複している場合にはIBM拡張文字のコードポイントを選択する

また、IANAのWindows-31Jでは定義されていませんが、 cp932では0xF040から0xF9FCをユーザー定義領域として使えるようになっている為、これらユーザー定義文字のUnicodeへのマッピングも定義してある。マッピング定義についてはTOG/JVC CDE/Motif 技術検討 WGによる Unicode とユーザ定義文字・ベンダ定義文字に関する問題点と解決策を参考にしています。

*3 参考: Microsoft Windows Codepage : 932
*4 参考: ベンダ定義文字の割り当てについては、TOG/JVC CDE/Motif 技術検討 WGの定義を参照
      Unicode とユーザ定義文字・ベンダ定義文字に関する問題点と解決策
      OSF 日本ベンダ協議会 (OSF/JVC) 推奨 日本語 EUC ・シフト JIS 間コード変換仕様とコード系実態調査


  2.2 Unicode 変換の差異

キャラクタセットcp932とキャラクタセットsjis、及びeucjpmsとujisではUnicodeへのマッピング定義が異なる文字がいくつかあります。以下、これらマッピングの差異を表にまとめます。

表2 - sjisとcp932でのUnicode変換の差異

sjis/cp932 での文字
sjis でのUnicode変換
cp932 でのUnicode変換
0x5C(YEN SGIN)
U+005C(REVERSE SOLIDUS)
U+005C(REVERSE SOLIDUS)
0x7E(OVERLINE)
U+007E(TILDE)
U+007E(TILDE)
0x815C(EM DASH)
U+2015(HORIZONTAL BAR)
U+2015(HORIZONTAL BAR)
0x815F(REVERSE SOLIDUS)
U+005C(REVERSE SOLIDUS)
U+FF3C(FULLWIDTH REVERSE SOLIDUS)
0x8160(WAVE DASH)
U+301C(WAVE DASH)
U+FF5E(FULLWIDTH TILDE)
0x8161(DOUBLE VERTICAL LINE)
U+2016(DOUBLE VERTICAL LINE)
U+2225(PARALLEL TO)
0x817C(MINUS SIGN)
U+2212(MINUS SIGN)
U+FF0D(FULLWIDTH HYPHEN-MINUS)
0x8191(CENT SIGN)
U+00A2(CENT SIGN)
U+FFE0(FULLWIDTH CENT SIGN)
0x8192(POUND SIGN)
U+00A3(POUND SIGN)
U+FFE1(FULLWIDTH POUND SIGN)
0x81CA(NOT SIGN)
U+00AC(NOT SIGN)
U+FFE2(FULLWIDTH NOT SIGN)

表3 - ujisとeucjpmsでのUnicode変換の差異

ujis/eucjpms での文字
ujis でのUnicode変換
eucjpms でのUnicode変換
0x5C(YEN SGIN) U+005C(REVERSE SOLIDUS)
U+005C(REVERSE SOLIDUS)
0x7E(TILDE)
U+007E(TILDE)
U+007E(TILDE)
0xA1B1(OVERLINE)
U+FFE3(FULLWIDTH MACRON)
U+FFE3(FULLWIDTH MACRON)
0xA1BD(EM DASH)
U+2015(HORIZONTAL BAR)
U+2015(HORIZONTAL BAR)
0xA1C0(REVERSE SOLIDUS)
U+005C(REVERSE SOLIDUS)
U+FF3C(FULLWIDTH REVERSE SOLIDUS)
0xA1C1(WAVE DASH)
U+301C(WAVE DASH)
U+FF5E(FULLWIDTH TILDE)
0xA1C2(DOUBLE VERTICAL LINE)
U+2016(DOUBLE VERTICAL LINE)
U+2225(PARALLEL TO)
0xA1DD(MINUS SIGN)
U+2212(MINUS SIGN)
U+FF0D(FULLWIDTH HYPHEN-MINUS)
0xA1F1(CENT SIGN)
U+00A2(CENT SIGN)
U+FFE0(FULLWIDTH CENT SIGN)
0xA1F2(POUND SIGN)
U+00A3(POUND SIGN)
U+FFE1(FULLWIDTH POUND SIGN)
0xA1EF(YEN SIGN)
U+FFE5(FULLWIDTH YEN SIGN)
U+FFE5(FULLWIDTH YEN SIGN)
0xA2CC(NOT SIGN)
U+00AC(NOT SIGN)
U+FFE2(FULLWIDTH NOT SIGN)
0x8FA2B7(TILDE)
U+007E(TILDE)
U+FF5E(FULLWIDTH TILDE)
0x8FA2C3(BROKEN BAR)
U+00A6(BROKEN BAR)
U+FFE4(FULLWIDTH BROKEN BAR)
NEC特殊文字(0x8740 - 0x879C)
0 1 2 3 4 5 6 7 8 9 A B C D E F
8740 @ A B C D E F G H I J K L M N O
8750 P Q R S T U V W X Y Z [ \ ] _
8760 ` a b c d e f g h i j k l m n o
8770 p q r s t u ~
8780
8790
87A0
87B0
87C0
87D0
87E0
87F0

NEC選定IBM拡張文字(0xED40 - 0xEEFC)
0 1 2 3 4 5 6 7 8 9 A B C D E F
ED40 \ ] ^ _ ` a b c d e f g h i j k
ED50 l m n o p q r s t u v w x y z {
ED60 | } ~
ED70
ED80
ED90
EDA0 ソ
EDB0
EDC0
EDD0
EDE0 @ A B C D E F G H I J K L M N
EDF0 O P Q R S T U V W X Y Z [
EE40 \ ] ^ _ ` a b c d e f g h i j k
EE50 l m n o p q r s t u v w x y z {
EE60 | } ~
EE70
EE80
EE90
EEA0 ソ
EEB0
EEC0
EED0
EEE0 @ A B C D E F G H I J K @
EEF0 A B C D E F G H I ¬ U V W

IBM拡張文字(0xFA40 - 0xFC4B)
0 1 2 3 4 5 6 7 8 9 A B C D E F
FA40 @ A B C D E F G H I T U V W X Y
FA50 Z [ \ ] ¬ U V W \ ] ^ _
FA60 ` a b c d e f g h i j k l m n o
FA70 p q r s t u v w x y z { | } ~
FA80
FA90
FAA0
FAB0 ソ
FAC0
FAD0
FAE0
FAF0
FB40 @ A B C D E F G H I J K L M N O
FB50 P Q R S T U V W X Y Z [ \ ] ^ _
FB60 ` a b c d e f g h i j k l m n o
FB70 p q r s t u v w x y z { | } ~
FB80
FB90
FBA0
FBB0 ソ
FBC0
FBD0
FBE0
FBF0
FC40 @ A B C D E F G H I J K
FC50
FC60
FC70
FC80
FC90
FCA0
FCB0
FCC0
FCD0
FCE0
FCF0
Copyright 2005 c Japan MySQL Partners Association. All Rights Reserved.