重新介绍了“未知的初始字符集索引”错误?
我有一个连接到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 。
collation_server和collation_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=utf8mb4
configurationMySQL服务器,并将characterEncoding
保留为Connector / J连接string。
Connector / J将自动检测UTF-8
设置
希望这可以帮助!