【发布时间】:2016-06-14 06:56:02
【问题描述】:
我有下表,name 为 LATIN1,其余为 UTF8。
CREATE TABLE `test_names` (
`name` varchar(500) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL,
`other_stuff_1` int DEFAULT NULL,
`other_stuff_2` varchar(45) DEFAULT NULL,
PRIMARY KEY (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
我在Java中遇到以下问题:
我SELECT ... FOR UPDATE。然后我在它的 ResultSet 上调用updateInt(2, 1) 和updateRow() 并得到Illegal mix of collations (latin1_bin,IMPLICIT) and (utf8_general_ci,COERCIBLE) for operation '<=>'。
如何在不更改表/连接字符集的情况下完成这项工作?
非常感谢。
--- 更新 ---
我使用SELECT name, other_stuff_1 FROM test_names LIMIT 1 FOR UPDATE;,连接字符串是DriverManager.getConnection("jdbc:mysql://" + host + ":" + port + "/" + db + "?allowMultiQueries=true", user, password);。
确切的堆栈跟踪是:
java.sql.SQLException: Illegal mix of collations (latin1_bin,IMPLICIT) and (utf8_general_ci,COERCIBLE) for operation '<=>'
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1086)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4237)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4169)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2617)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2778)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2834)
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2156)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2441)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2366)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2350)
at com.mysql.jdbc.UpdatableResultSet.updateRow(UpdatableResultSet.java:2405)
【问题讨论】:
-
请提供完整的
SELECT语句,以及交易中的其他语句。请提供连接MySQL时使用的连接参数。 -
已更新。谢谢你的帮助,@RickJames。
-
将
SELECT语句更改为SELECT name, other_stuff_1 FROM test_names LIMIT 1 ORDER BY name COLLATE latin1_bin FOR UPDATE。我没有测试这个语句,它需要 MySQL 5.7 或更高版本。 -
非常感谢您的回答,@beckyang。我试过
ORDER BY name COLLATE latin1_bin LIMIT 1 FOR UPDATE(ORDER BY 在 LIMIT 前面),但不幸的是仍然收到java.sql.SQLException: Illegal mix of collations (latin1_bin,IMPLICIT) and (utf8_general_ci,COERCIBLE) for operation '<=>'。 -
可能是 Connector/J 中的一个错误——您使用的似乎是 v5.1.29,而当前的 GA 版本是 v5.1.38。您可以尝试使用最新版本吗?
标签: java mysql resultset collation