重新介绍了“未知的初始字符集索引”错误?

我有一个连接到mysql服务器的Java客户端应用程序。 客户端和服务器都在Docker容器中运行。

我注意到官方的mysql Docker镜像最近更新了mysql服务来运行Version: '8.0.1-dmr'

由于此更改,我的Java客户端应用程序无法连接到mysql实例; 它会失败,并出现以下错误:

 Caused by: java.sql.SQLException: Unknown initial character set index '255' received from server. Initial client character set can be forced via the 'characterEncoding' property. at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:910) ~[mysql-connector-java-5.0.8-bin.jar:na] at com.mysql.jdbc.Connection.configureClientCharacterSet(Connection.java:2412) ~[mysql-connector-java-5.0.8-bin.jar:na] at com.mysql.jdbc.Connection.initializePropsFromServer(Connection.java:4139) ~[mysql-connector-java-5.0.8-bin.jar:na] at com.mysql.jdbc.Connection.createNewIO(Connection.java:2789) ~[mysql-connector-java-5.0.8-bin.jar:na] at com.mysql.jdbc.Connection.<init>(Connection.java:1555) ~[mysql-connector-java-5.0.8-bin.jar:na] at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:285) ~[mysql-connector-java-5.0.8-bin.jar:na] at org.apache.tomcat.jdbc.pool.PooledConnection.connectUsingDriver(PooledConnection.java:307) ~[tomcat-jdbc-8.0.20.jar:na] at org.apache.tomcat.jdbc.pool.PooledConnection.connect(PooledConnection.java:200) ~[tomcat-jdbc-8.0.20.jar:na] at org.apache.tomcat.jdbc.pool.ConnectionPool.createConnection(ConnectionPool.java:699) ~[tomcat-jdbc-8.0.20.jar:na] at org.apache.tomcat.jdbc.pool.ConnectionPool.borrowConnection(ConnectionPool.java:633) ~[tomcat-jdbc-8.0.20.jar:na] at org.apache.tomcat.jdbc.pool.ConnectionPool.getConnection(ConnectionPool.java:186) ~[tomcat-jdbc-8.0.20.jar:na] at org.apache.tomcat.jdbc.pool.DataSourceProxy.getConnection(DataSourceProxy.java:126) ~[tomcat-jdbc-8.0.20.jar:na] 

我不拥有Java客户端应用程序的源代码,因此我无法轻松升级它正在使用的JDBC驱动程序(这是mysql-connector-java-5.0.8-bin.jar )。

这是与以前的mysqldb:8运行mysqld的mysqldb:8映像工作Version: '8.0.0-dmr'

有没有解决这个问题,不涉及更新JDBC驱动程序? 这是mysqld的回归吗?

这里谈到8.0以来发生的变化。已经列出来的一个要点就是:

字符集支持

重要更改:默认字符集已从latin1更改为utf8mb4。 这些系统variables受到影响:

character_set_server和character_set_database系统variables的默认值已经从latin1更改为utf8mb4

collat​​ion_server和collat​​ion_database系统variables的默认值已从latin1_swedish_ci更改为utf8mb4_0900_ai_ci

因此,新对象的默认字符集和sorting规则与以前不同,除非指定了明确的字符集和sorting规则。 这包括其中的数据库和对象,如表,视图和存储的程序。


保留以前默认值的一种方法是使用my.cnf文件中的这些行来启动服务器:

 [mysqld] character_set_server=latin1 collation_server=latin1_swedish_ci 

另一个选项,因为你正在运行docker工人,是指定这些configuration选项作为docker运行命令的命令行参数。 例如:

 docker run -d \ --network my-net \ -h mysqldb \ --name mysqldb \ -p 3306:3306 \ -e MYSQL_RANDOM_ROOT_PASSWORD=yes \ -e MYSQL_DATABASE=mydb \ -e MYSQL_USER=admin \ -e "MYSQL_PASSWORD=admin" \ mysql:8 --character-set-server=latin1 --collation-server=latin1_swedish_ci 

在客户端,如果你想进行更改 – 希望这些应该足够了:

要使用连接器/ J使用4字节的UTF-8字符集,请使用character_set_server=utf8mb4configurationMySQL服务器,并将characterEncoding保留为Connector / J连接string。

Connector / J将自动检测UTF-8设置

希望这可以帮助!