アプリ版:「スタンプのみでお礼する」機能のリリースについて

Java初心者です。

(確認したい内容)

ServletからMySQLのデータを取得したResultSetの項目で、2バイト文字が文字化けしていました。
私自身で調査した結果、
str = new String(str.getBytes("ISO-8859-1"), "JISAutoDetect");
※str…文字化けしている項目
のコーディングで文字化けが解消されました。

しかし、この対応だと全ての2バイト文字に対して、このコーディングを入れなければなりません。
これはスタンダードなコーディングなんでしょうか?
それとも環境周りの設定一発で不要になるものなんでしょうか?

私自身の周りに先生がいないため、自分の書いてるコーディングに自信がありません。
ご意見よろしくお願いします。

(環境)
WinXP-Pro-SP1
j2sdk4.1.2_05
Tomcat4.1.24
Eclipse2.1.3
MySQL4.1.7

A 回答 (4件)

MySQLのバージョンあわせてませんでした。


すみません。

>必ずUTF8経由での文字変換していてそのマッピングがSJISとEUCだけだから
>一部文字列が通らない
>サーバーもクライアントもUTF8設定ならキャラクタ変換が起こらないので
>クライアント側であらためて好きな文字コードに変換するしか今のところない

というように2バイト文字の扱いが変化しているようです。

おそらくダウングレードするか、マイナーバージョンアップするのを待つと直ると思いますが、
クラス設計をすることによって回避できます。
つまりResultSetインターフェースを実装したカスタムResultSetを作成するとビジネスロジックを変化させることなく、文字化けやその他の低レベル層での環境の違いをResultSetで吸収できます。
いいかえてみるならば、JDBCドライバをカスタム化するといってもいいでしょうか。

もちろんResultSetはStatementオブジェクトから取得されますから、Statementオブジェクトもカスタム化します。

コネクション周りは大手ベンダーはすべてカスタム化して、フレームワークに埋めこんでますので、一度コネクション周りを作ってみるのもいいかもしれません。

私も製品としてフレームワークとコネクション周りを作成しましたが、相当便利になります。
    • good
    • 0
この回答へのお礼

hidebu-さん、ありがとうございました。

>おそらくダウングレードするか、マイナーバージョンアップするのを待つと直ると思いますが、
>クラス設計をすることによって回避できます。

とりあえず今の私の知識レベルだと、ダウングレードかマイナーバージョンアップを
待つ方法を取りたいと思います。

カスタム化については、もう少しJavaの知識を増やしつつ勉強したいと思います。

お礼日時:2004/11/07 12:07

とりあえずコネクション部分の接続文字列がきちんとしていれば可能なはずです



-------------------------------------------------

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());
}
}
}
}

-------------------------------------------------
こんな感じになると思いますが
どこか相違点ありますか?

この回答への補足

以下のようなコーディングです。

//コネクションの取得メソッド
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をしようしているのが原因でしょうか?

補足日時:2004/11/06 23:14
    • good
    • 0

JDBCドライバの実装に依存しますが、


基本的にJDBCのコンバータとMySqlの文字エンコーディングがあっていないんでしょう。

JDBCドライバのバージョンとMySqlの文字エンコーディングが何なのかを教えてくれると判断しやすいですが。

普通はコネクションなどはFactryパターン等を使用して、取得するようにします。

ステートメント取得
クエリー発行
レコード取得

といった感じになっていると思いますが、生のコネクションからステートメントを取得すると、ステートメントやResultSetをラッピングすることができなくなるので、いろいろと厄介ですよ。
ResultSetをラッピングしておけば、ResultSet内のgetString()等のメソッド内で適切なエンコーディングが出来ますから。

この回答への補足

ご回答ありがとうございます。

使用しているJDBCは以下のものです。
mysql-connector-java-3.0.15-ga-bin.jar

MySQLの文字エンコーディング
[mysqld]
default-character-set=sjis

です。

補足日時:2004/11/06 19:04
    • good
    • 0

まず、mysql に接続


mysql> SHOW CHARACTER SET
とすれば、お使いのmysqlのキャラクタセットが分かります。
それが合っていない可能性が。
my.cnf で設定を確認できます。

どこに問題があるか分からなくなったときは、文字列を hex (16進) に変換して出力すると、何がどうなってるか分かることが多いですよ。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

mysql> SHOW CHARACTER SET の結果には34個のcharacter set が出てきました。
その中にはsjisも入ってました。

my.iniの設定には
[mysqld]
default-character-set=sjis
が記述されています。

文字列の16進変換は未着手です。

お礼日時:2004/11/06 19:02

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!