gpt4 book ai didi

java - 如何解决 "Illegal mix of collations"SQLException?

转载 作者:可可西里 更新时间:2023-11-01 07:57:00 26 4
gpt4 key购买 nike

我查看了 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):

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 的建议,我使用了以下网址:

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

它确实有效,但是,我注意到了一个副作用。当我使用 testserver 更新和插入数据时,它在 win XP 机器上运行 mysql,一切正常。但是当我更新数据并将其插入到运行 Ubuntu 的生产服务器时,我确实得到了行,其中有 ?-signs 而不是 ő,ű-letters。从那以后,我通过变通办法解决了这个问题,但如果能看到并理解哪里出了问题,这里有什么问题,那就太好了。

最佳答案

你需要使用 UTF-8 字符集

在连接 URL 中试试这个

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

数据库 CHARSET=utf8

数据库整理 = utf8_general_ci

关于java - 如何解决 "Illegal mix of collations"SQLException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11207027/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com