4

私はmysqlリファレンスを調べました。ここではstackoverflowを調べましたが、多くの人が文字エンコードに問題を抱えているようですが、この問題に対する明確な答えを見つけることができませんでした。

Javaプログラムはmysqlデータベースを使用しており、クエリにű、őのような特殊文字がある場合(ただし、á、é、í、ó、úは機能します)、SQLExceptionをスローします。

    Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
    Connection conn = DriverManager.getConnection(
            "jdbc:odbc:<database>", "<user>", "<pass>"
            );

    PreparedStatement stmt = conn.prepareStatement(
            " select username, priority " +
            " from users " +
            " where username like ?");
            //" where username like ? collate latin2_general_ci");
    stmt.setString(1, "Ernő");
    ResultSet rs = stmt.executeQuery();
    while(rs.next()) {
        System.out.println(rs.getString("username") + "  " + rs.getInt("priority"));
    }

例外:

Exception in thread "main" java.sql.SQLException:
[MySQL][ODBC 5.1 Driver][mysqld-5.1.63-0ubuntu0.10.04.1]
Illegal mix of collations (latin2_hungarian_ci,IMPLICIT)
and (latin1_swedish_ci,COERCIBLE) for operation 'like'

テーブル構造は次のとおりです。

CREATE TABLE `users` (
`username` varchar(45) COLLATE latin2_hungarian_ci NOT NULL,
`password` varchar(45) COLLATE latin2_hungarian_ci NOT NULL,
`priority` tinyint(4) NOT NULL,
`idCimlistaFK` int(10) unsigned DEFAULT NULL,
`timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`username`),
KEY `fk_users_tbl_Cimlista1` (`idCimlistaFK`),
CONSTRAINT `fk_users_tbl_Cimlista1` FOREIGN KEY (`idCimlistaFK`)
REFERENCES `tbl_cimlista` (`id_Cimlista`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=latin2 COLLATE=latin2_hungarian_ci 

コメント行のように照合を強制しようとしたとき:

" where username like ? collate latin2_general_ci");

また、例外をスローします。

COLLATION 'latin2_general_ci' is not valid for CHARACTER SET 'latin1'

誰かがこれを解決する方法を知っていますか(おそらくJava内で)?(データベースはレガシーシステムであるため、変更したくないです。)

アップデート:

Rahul Agrawalが提案したように、私は次のURLを使用しました。

"jdbc:mysql://localhost:3306/database?characterEncoding=latin2"

それはうまくいきました、しかし、私は副作用に気づきました。テストサーバーでデータを更新して挿入したところ、Win XPマシンでmysqlを実行すると、問題なく動作しました。しかし、Ubuntuを実行している本番サーバーにデータを更新して挿入すると、行が取得され、代わりにő、ű-文字が含まれていました。それ以来、回避策でこれを解決しましたが、何がうまくいかなかったのか、ここでの問題は何かを見て理解するのは素晴らしいことです。

4

2 に答える 2

8

UTF-8文字セットを使用する必要があります

接続URLでこれを試してください

jdbc:mysql://localhost:3306/testdb?characterEncoding=utf8

データベースCHARSET=utf8

データベース照合=utf8_general_ci

于 2012-06-26T12:42:43.963 に答える