ver 3.1.9 EUC_JP_Solarisの追加
MySQL 5.0.3からサーバ側に追加されたeucjpmsに対応するJava側の文字コードとして,EUC_JP_Solarisが使用できるようになる予定です.
EUC_JPよりはeucjpmsと類似性が高いため追加を依頼しましした.
String url = "jdbc:mysql://localhost/test";
Properties props = new Properties();
props.put("user", "");
props.put("password", "");
props.put("useUncode", "true");
props.put("characterEncoding", "EUC_JP_Solaris");
Class.forName("com.mysql.jdbc.Driver").newInstance();
DriverManager.getConnection(url, props).close();
EUC_JPとの違いはまずNEC拡張文字,NEC選定IBM拡張文字,IBM拡張文字が使えるようになることです.
そしてもう1点,EUC_JP_Solarisは使える文字集合についてはeucjpmsと同じですが,JREによるunicode変換ルールはujis寄り(EUC_JPと同じ)なので以前の日記(http://d.hatena.ne.jp/mir/20050517#p3)で示したujisとeucjpmsで変換ルールの異なる文字というのがいくつか使えません.
サーバ側で確認するとINSERTはできているのですが,SELECTした際に文字が破壊されるかujis側の文字として復元されるため見た目が似ているけどちょっと違う文字になる(例えばDOUBLE VERTICAL LINEとPARALLEL TOの違い),といった現象が起きています.これはcharacterSetResultを設定しているいないに関わらず発生します.JREが原因と踏んでいます.
EUC_JP_Solarisがこのような欠点を持っているにも関わらずConnector/Jへの実装追加を依頼したのは,それでも上記3種類の拡張文字が使えるようになるのはメリットであることと,この欠点となっている特殊記号は実際に現場では極端な例を除いて使用しないだろうから影響は少ないであろうこと,今までどおりEUC_JPは使えるから嫌なら単にEUC_JP_Solarisを使わなければいいだけの問題であるということからです.まあeucjpmsに完全対応なJavaの文字コードが今後作られればそれにとって代えたいですが.
またConnector/J ver3.1.8ではMySQL 5.0.3以上に対してはEUC_JPを指定されたら問答無用にujisではなくeucjpmsにマッピングするようになっていました.しかしEUC_JPでeucjpmsを使うメリットは無いので意味がありませんでした.
今後EUC_JPと書いたら常にujisにマッピングされます.そして上記拡張文字を使いたいというのであればMySQL 5.0.3以上と一緒にEUC_JP_Solarisを使えばよい,という感じになります.シンプルなところに落ち着いた,と思っています.
追記:
ところでConnector/J以外のコネクタはMySQL 4.1以降の日本語の取り扱いはどうなってるんでしょう.すごく気になりますがまだ調べてません.実はRubyもMySQLコネクタに一番興味があったり.