- PR -

hibernateでDBの日本語情報を扱う方法

投稿者投稿内容
take
大ベテラン
会議室デビュー日: 2004/08/13
投稿数: 177
お住まい・勤務地: 沖縄県北部
投稿日時: 2005-09-20 04:14
いつもお世話になります。開発環境:windowsXP(HOME) j2sdk1.4.2_06、
TOMCAT4.1.31、ECLIPSE3.0.1、MYSQL4.1、struts1.1、HIBERNATE2.1.7、
velocity1.4 です。

HIBERNATEを使用、エラー処理はSTRUTS、表示をvelocityにさせるWEBアプリを
作成しようとしたら、日本語を表示させようと頑張っても文字化けしてしまいます。
解決策が見つからず質問させていただいたところです。

今回は問題の切り分けのために、HIBERNATE、STRUTS、velocityそれぞれで
データベースに直接アクセスさせてみたところ、文字化けするのはHIBERNATEで
データベースにアクセスしたときのようなのでHIBERNATEで日本語を扱う方法を
ご存知の方がいらっしゃいましたらご教示願います。

*** DBから情報をリストで取得するクラスのソース ***

import java.util.List;

public class TestList {


public TestList() {
}

public List getList(){
List list=null;

try{
Configuration cfg = new Configuration();
cfg.configure();
SessionFactory sf = cfg.buildSessionFactory();
Session sess = sf.openSession();

Criteria cri = sess.createCriteria(Test1.class);

list = cri.list();

sess.close();


} catch(HibernateException e){
//e.printStackTrace();
System.out.println(e.getMessage());
}
return list;

}
}

*** テスト表示用mainクラス ***
import java.util.Iterator;

import entity.hibernate.Test1;

public class TestYobi {

public static void main(String[] args) {
TestList testList = new TestList();
java.util.List list= testList.getList();

for(Iterator ite = list.iterator(); ite.hasNext();){
Test1 test1 = (Test1)ite.next();
System.out.println(test1.getName()
+ ":"+ test1.getEmail());
}

}
}

データベースに登録した情報はコマンドプロンプトからMYSQLを起動、
コマンドプロンプトで漢字入力ができる状態でINSERT処理をしたので
エンコードはSJISになってると思います(OS=winXP)。WEBアプリを
作成中にエンコードの指定等は全てSJISで行っておりました。今回の
mainテスト用のクラスでもコンソールに文字化けが出てしまって
まいっております。
どうかよろしくお願いします。
take
大ベテラン
会議室デビュー日: 2004/08/13
投稿数: 177
お住まい・勤務地: 沖縄県北部
投稿日時: 2005-09-21 17:44
自己レスです。

WEBにもなかなか情報がないのでHIBERNATEはあきらめたほうがいいのかなーみたいなテンションになってきております。結構使ってるひといるような感じだったので使ってみたのですが・・・。その辺だけでも情報いただけるとありがたいです。
あしゅ
ぬし
会議室デビュー日: 2005/08/05
投稿数: 613
投稿日時: 2005-09-21 19:06
Hibernateが原因となって文字化けした記憶はないです。
JDBCドライバ側が問題になってるのではないでしょうか。

MySQLの日本語処理が怪しそうな気がします。

#どこかでそんな記事を見かけたような??
take
大ベテラン
会議室デビュー日: 2004/08/13
投稿数: 177
お住まい・勤務地: 沖縄県北部
投稿日時: 2005-09-21 22:18
あしゅさんご返答ありがとうございます。確かにWEBでもhibernateの
エンコード処理等のサイトは皆無に近いです。というかいままで
見たことがありません。やはりあしゅさんのおっしゃるとおりhibernate
が原因と考えるよりも他に原因があると考えたほうがよろしいのでしょうか。

MYSQL4.1系は文字化けのバグがあるとのことなので4.0にしてみたのですが
やっぱりだめでした。データ登録の方法に問題があるのか・・・。
JSPやSTRUTUS経由のJSPでちゃんと表示できてるのでMYSQLには問題が無いと
決め付けてしまいました。

もう一度確かめてみます。
take
大ベテラン
会議室デビュー日: 2004/08/13
投稿数: 177
お住まい・勤務地: 沖縄県北部
投稿日時: 2005-09-27 15:26
すみません、大分時間が経ってしまいました。
いろいろ調べているうちに壁にぶち当たってしまいました。
どなたかお助けください。

String.getBytesメソッドを使用してデータベースに登録
して呼び出した文字列とそうでない文字列を比較して、
返された値からどの文字セットを使用しているかを調べよう
と思ったのですが、どのように調べたらいいのかが見つかりません。

**「a」という文字をデータベース経由とソースコードから **
** そのままgetBytesで取り出したものの比較       **

データベース経由→   [B@1774b9b
ソースコードそのまま→ [B@104c575

文字セットの種類が分かれば大分前進できそうな感じがします。
ちなみに使用したクラスのソースは下記のとおりです。
HIBERNATEを経由してデータベースにアクセスしています。

package test;

import java.util.Iterator;

import entity.hibernate.Test1;

/**
* @author takeshi
*
* この生成されたコメントの挿入されるテンプレートを変更するため
* ウィンドウ > 設定 > Java > コード生成 > コードとコメント
*/
public class TestYobi {

public static void main(String[] args) {
String testStr=null;

TestList testList = new TestList();
java.util.List list= testList.getList();

for(Iterator ite = list.iterator(); ite.hasNext();){
Test1 test1 = (Test1)ite.next();
System.out.println(test1.getName());

System.out.println(test1.getName().getBytes());

}

testStr="a";
System.out.println(testStr.getBytes());

}
}


どなたかよろしくお願いします。
takashi
ベテラン
会議室デビュー日: 2004/02/12
投稿数: 79
お住まい・勤務地: 東京
投稿日時: 2005-09-27 16:08
こんにちは。

MySQLの設定ファイル、mysql.iniにdefault-character-setなるパラメータが
ありますが、この辺関係ありますでしょうか?
参考URL
http://wind-master.dip.jp/soft-info/mysql/mysql02.html

以上お役に立てれば幸いです。
take
大ベテラン
会議室デビュー日: 2004/08/13
投稿数: 177
お住まい・勤務地: 沖縄県北部
投稿日時: 2005-09-27 16:48
takashi、すばやいレスありがとうございます。

引用:

MySQLの設定ファイル、mysql.iniにdefault-character-setなるパラメータが
ありますが、この辺関係ありますでしょうか?
参考URL
http://wind-master.dip.jp/soft-info/mysql/mysql02.html

以上お役に立てれば幸いです。



my.iniの内容は以下のようにしています。

[WinMySQLAdmin]
Server=C:/mysql/bin/mysqld-nt.exe
[mysqld]
default-character-set=sjis
[client]
default-character-set=sjis

OSはwindowsなのでsjisでいいのかなと。
もしこの設定が正しければ、データベース経由の
文字列はsjisでエンコードされて出力されている
はずですよね?
sjisでエンコードされてる文字をgetBytesしたら
[B@1774b9b
になると理解してます。あってます?

としたらソースコードのリテラルをgetBytesした
値のエンコードはなんなんでしょう??
[B@104c575  ←こいつです

レテラルを直接getBytesした値を確認する前に、
とりあえずmy.iniの設定が正しいかどうかを確認したいのですが
コマンドを見つけることができません。
わかれば確認できるのですが・・・。

mysql> show character set;

では見れないんですよね?
ちょま吉
大ベテラン
会議室デビュー日: 2004/08/04
投稿数: 112
投稿日時: 2005-09-28 01:17
String.getBytes()はバイト配列を返します。
このバイト配列をSystem.out.printlnすると配列のハッシュコードが表示されるだけです。
このバイト配列の中身(文字コード)を見たいのであれば、
16進数で1バイトづつダンプする必要があると思います。

スキルアップ/キャリアアップ(JOB@IT)