我有一张表格,其中
我在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);"。
确切的堆栈跟踪如下:
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时使用的连接参数。 - Rick JamesSELECT
语句更改为SELECT name, other_stuff_1 FROM test_names LIMIT 1 ORDER BY name COLLATE latin1_bin FOR UPDATE
。我没有测试这个语句,它需要MySQL 5.7或更高版本。 - Beck YangORDER 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 '<=>'
的错误提示。 - dotwin