• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:DBから取得したデータの文字化け)

DBから取得したデータの文字化け

このQ&Aのポイント
  • ServletからMySQLのデータを取得したResultSetの項目で、2バイト文字が文字化けしていました。文字化けを解消するためには、特定のコーディングを入れる必要がありますが、他の解決策はないのでしょうか?
  • ServletからMySQLのデータを取得したResultSetの項目で、2バイト文字が文字化けしていました。文字化けを解消するためには、特定のコーディングを入れる必要がありますか?それとも環境の設定で解決できるのでしょうか?
  • ServletからMySQLのデータを取得したResultSetの項目で、2バイト文字が文字化けしています。文字化けを解消するためには、特定のコーディングを入れる必要があるのですが、他にも解決策はあるのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • hidebu-
  • ベストアンサー率53% (45/84)
回答No.4

MySQLのバージョンあわせてませんでした。 すみません。 >必ずUTF8経由での文字変換していてそのマッピングがSJISとEUCだけだから >一部文字列が通らない >サーバーもクライアントもUTF8設定ならキャラクタ変換が起こらないので >クライアント側であらためて好きな文字コードに変換するしか今のところない というように2バイト文字の扱いが変化しているようです。 おそらくダウングレードするか、マイナーバージョンアップするのを待つと直ると思いますが、 クラス設計をすることによって回避できます。 つまりResultSetインターフェースを実装したカスタムResultSetを作成するとビジネスロジックを変化させることなく、文字化けやその他の低レベル層での環境の違いをResultSetで吸収できます。 いいかえてみるならば、JDBCドライバをカスタム化するといってもいいでしょうか。 もちろんResultSetはStatementオブジェクトから取得されますから、Statementオブジェクトもカスタム化します。 コネクション周りは大手ベンダーはすべてカスタム化して、フレームワークに埋めこんでますので、一度コネクション周りを作ってみるのもいいかもしれません。 私も製品としてフレームワークとコネクション周りを作成しましたが、相当便利になります。

b-u-z-z
質問者

お礼

hidebu-さん、ありがとうございました。 >おそらくダウングレードするか、マイナーバージョンアップするのを待つと直ると思いますが、 >クラス設計をすることによって回避できます。 とりあえず今の私の知識レベルだと、ダウングレードかマイナーバージョンアップを 待つ方法を取りたいと思います。 カスタム化については、もう少しJavaの知識を増やしつつ勉強したいと思います。

すると、全ての回答が全文表示されます。

その他の回答 (3)

  • hidebu-
  • ベストアンサー率53% (45/84)
回答No.3

とりあえずコネクション部分の接続文字列がきちんとしていれば可能なはずです ------------------------------------------------- public class test { static public void main(String[] args) { Connection connection = null; try{ Class.forName("org.gjt.mm.mysql.Driver"); connection = DriverManager.getConnection("jdbc:mysql:///test?useUnicode=true&characterEncoding=SJIS");//接続文字列 Statement statement = connection.createStatement(); ResultSet resultSet = statement.executeQuery("select * from test"); if(resultSet.next()){ System.out.println(resultSet.getString(2)); //対象の文字列を取得するところ } }catch(Exception e){ e.printStackTrace(); }finally{ try { connection.close(); } catch (Exception e) { throw new RuntimeException(e.toString()); } } } } ------------------------------------------------- こんな感じになると思いますが どこか相違点ありますか?

b-u-z-z
質問者

補足

以下のようなコーディングです。 //コネクションの取得メソッド private static Connection _getConnection() throws NamingException, SQLException { /* イニシャルコンテキストの取得 */ Context ctx = new InitialContext(); /* データソースをアプリケーションサーバーから取得(JNDIのルックアップ) */ DataSource ds = (DataSource) ctx.lookup("java:comp/env/データソース名"); /* コネクションを取得して返す */ return ds.getConnection(); } //MySQLからのデータ取得メソッド(一部抜粋) public static UserData checkUser(String empid, String passwd) throws Exception { /* ユーザテーブルからのデータ取得SQL */ String sqlstr = "select * from user_tbl where empid = ?"; Connection con = null; UserData user = new UserData(empid); try { /* コネクションの取得 */ con = _getConnection(); PreparedStatement stmt = null; ResultSet rs = null; try { /* PreparedStatementを作成し問い合わせを実行 */ stmt = con.prepareStatement(sqlstr); stmt.setString(1,empid); rs = stmt.executeQuery(); /* 結果の存在確認 */ if (!rs.next()) { user.setLoginState("user_not_found"); return user; } /* パスワードのチェック */ if (!rs.getString(2).equals(passwd)) { user.setLoginState("passwd_invalid"); return user; } /* ユーザ情報をセット */ user.setEmpName(rs.getString(3)); ----------------------------------------------------------------- データソースurl jdbc:mysql://localhost/empdb?useUnicode=true&characterEncoding=SJIS 余計なコードも入ってしまっていますが、私が分かる相違点として以下のことがあります。 1.lookupを使用している 2.prepareStatementを使用している ※MySQL4.1.7をしようしているのが原因でしょうか?

すると、全ての回答が全文表示されます。
  • hidebu-
  • ベストアンサー率53% (45/84)
回答No.2

JDBCドライバの実装に依存しますが、 基本的にJDBCのコンバータとMySqlの文字エンコーディングがあっていないんでしょう。 JDBCドライバのバージョンとMySqlの文字エンコーディングが何なのかを教えてくれると判断しやすいですが。 普通はコネクションなどはFactryパターン等を使用して、取得するようにします。 ステートメント取得 クエリー発行 レコード取得 といった感じになっていると思いますが、生のコネクションからステートメントを取得すると、ステートメントやResultSetをラッピングすることができなくなるので、いろいろと厄介ですよ。 ResultSetをラッピングしておけば、ResultSet内のgetString()等のメソッド内で適切なエンコーディングが出来ますから。

b-u-z-z
質問者

補足

ご回答ありがとうございます。 使用しているJDBCは以下のものです。 mysql-connector-java-3.0.15-ga-bin.jar MySQLの文字エンコーディング [mysqld] default-character-set=sjis です。

すると、全ての回答が全文表示されます。
  • uzzra
  • ベストアンサー率43% (55/127)
回答No.1

まず、mysql に接続 mysql> SHOW CHARACTER SET とすれば、お使いのmysqlのキャラクタセットが分かります。 それが合っていない可能性が。 my.cnf で設定を確認できます。 どこに問題があるか分からなくなったときは、文字列を hex (16進) に変換して出力すると、何がどうなってるか分かることが多いですよ。

b-u-z-z
質問者

お礼

ご回答ありがとうございます。 mysql> SHOW CHARACTER SET の結果には34個のcharacter set が出てきました。 その中にはsjisも入ってました。 my.iniの設定には [mysqld] default-character-set=sjis が記述されています。 文字列の16進変換は未着手です。

すると、全ての回答が全文表示されます。

関連するQ&A