- - PR -
hibernateでDBの日本語情報を扱う方法
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2005-09-28 08:35
ちょま吉さんご返答ありがとうございます。
当方String.getBytes()で取り出した値は文字コードだと 勘違いしておりました。ご指摘ありがとうございます。 取り急ぎ16進数で1バイトずつダンプする方法を 調べてきます。 | ||||
|
投稿日時: 2005-10-05 14:06
どうしても分かりません。お助けください。
TEST用のクラスを作成し、実行結果を比べてみました。 ***** 文字列をデータベースに登録 ***** package test; public class TestMain { public static void main(String[] args){ Test1Insert insert = new Test1Insert(); insert.insertTest1("あ"); } } ***** データベースから呼び出していろいろ ***** public static void main(String[] args) { String testStr=null; char testChar; TestList testList = new TestList(); java.util.List list= testList.getList(); String dataBaseKeiyu = null ; for(Iterator ite = list.iterator(); ite.hasNext();){ Test1 test1 = (Test1)ite.next(); dataBaseKeiyu=test1.getName(); System.out.println("----- TestYobi データベース経由-----"); System.out.println(dataBaseKeiyu); System.out.println(dataBaseKeiyu.charAt(0)); System.out.println(Integer.toHexString(dataBaseKeiyu.charAt(0))); } System.out.println("----- TestYobi ソース直接(String)-----"); testStr="あ"; System.out.println(testStr); try { //変更箇所。ここをいろいろいじって結果を見る。 String str=new String(testStr.getBytes(),"shift-jis"); char jis=str.charAt(0); System.out.println("---- Shift-jis ----"); System.out.println(Integer.toHexString(jis)); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } } //変更箇所をいろいろいじって得た結果。全て「あ」という 文字を使って実験しています。 データベース経由の"あ"という文字を16進数ダンプすると、 ff82 になります。しかし、ソースコード経由で変数に格納した文字を 16進数ダンプすると 3042 になります。 データベース経由、ソースコード直接記述の文字のどちらも EUC-JPでエンコードしなおして新しい文字をString型に格納し、 それを16進数ダンプすると両方とも fffd になるのです。 しかしデータベース経由、ソースコード直接記述の文字のどちらも shift-jisでエンコードしなおして新しい文字列をString型に格納し、 それを16進数ダンプするとデータベース経由の文字は ff82 になり、ソースコード直接の文字は 3042 になるのです。ここで結果が同じにならない理由が分かりません。 ff82という値がどの文字セットを使用して「あ」になるのかが 分かれば前に進めそうですが、調べても調べ方が正しくないのか なかなか前に進めません。 どなたかご存知の方お願いします。 | ||||
|
投稿日時: 2005-10-07 23:07
自己レスですが、他の文字もダンプしてみたら、データベース経由の文字は全てff82になってしまうのです。これはおかしいと思いよく見てみると、登録した文字は1文字なのに二文字取り出す処理で二文字取り出せてしまいます。しかも1文字目はどの文字も(今回はひらがなしか試してないですが)ff82という値になります。先頭に2バイト文字1文字分の何か特別な値が入ってるような感じがするのです。今はそれが何なのかを調べてます。どなたかご存知の方がいらっしゃいましたらご教示ください。 | ||||
|
投稿日時: 2005-10-07 23:40
やはりJDBCドライバやデータベースの設定間違いかバグでしょうね。
Shift_JISでの'あ'は82a0なのでバイトスワップ後に後続バイトが欠落しているとか。 可能ならば他のDBを使って試されてはいかがですか? PostgreSQLとか、HSQLDBとか。 | ||||
|
投稿日時: 2005-10-07 23:49
追記です。データベース経由でダンプした
一文字目のffと2文字目のffを除くとなんと shift-jisの文字コードと一致するのです。 文字:一文字目:二文字目:ff削除 あ:ff82:ffa0:82a0 い:ff82:ffa2:82a2 う:ff82:ffa4:82a4 こ:ff82:ffb1:82b1 「あ」をshift-jisの文字コードでは 「82a0」で表現するみたいです。同様に 他のひらがなも一致しています。 で、データベースから取り出した時にくっつく この「ff」はなんなんでしょう。 これを調べると解決一歩手前ってことですよね? データベースの仕様の問題とかでしょうか?? ご存知の方がいらっしゃったらお願いします。 | ||||
|
投稿日時: 2005-10-07 23:56
いや・・・仕様っていうかおかしいですよ。それ。 MySQLの最新バージョンは調査してみましたか? 思いっきりバグ報告に上がってそうな気がします。 | ||||
|
投稿日時: 2005-10-08 00:14
あしゅさん、ご返答ありがとうございます。
バグっていうのはぜんぜん勘定に入れてませんでした。 取り急ぎ調べてみます。 ・・・って初めて調べるんですけど、MYSQLのページで いいんですよね?とりあえずいってきます。 | ||||
|
投稿日時: 2005-10-08 09:49
一度、HIBERNATEを使わずにJDBCだけのソースコードでselectやinsert()を試みられたら如何でしょうか?もしJDBCだけのコードでもデータがおかしいようでしたら、MySQL(とMySQLのJDBCドライバ)関連のサイトに情報が出ている可能性があります。また、JDBC経由で文字化けがしなくなったのにHIBERNATE経由でもまだ文字化けするようであれば、HIBERNATE自体に何かあると思います。
それと今現在のMySQLのバージョンは4.0でよろしいですか?(最初4.1で、途中4.0に変更したとの記述があったので確認です) |