私は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を実行している本番サーバーにデータを更新して挿入すると、行が取得され、代わりにő、ű-文字が含まれていました。それ以来、回避策でこれを解決しましたが、何がうまくいかなかったのか、ここでの問題は何かを見て理解するのは素晴らしいことです。