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

时间:2017-05-16 01:21:51

标签: java mysql docker jdbc

我有一个连接到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)。

这适用于之前运行mysqld mysqldb:8的{​​{1}}泊坞窗图片

此问题是否有任何解决方法不涉及更新JDBC驱动程序?这是Version: '8.0.0-dmr'中的回归吗?

1 个答案:

答案 0 :(得分:4)

This讨论自8.0以来发生的变化 列出的要点之一就是:

  

字符集支持

     

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

     

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

     

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

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

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

[mysqld]
character_set_server=latin1
collation_server=latin1_swedish_ci

另一个选项是,因为您正在运行docker,所以将这些配置选项指定为docker run命令的命令行参数。例如:

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

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

要使用带有Connector / J的4字节UTF-8字符集,请使用character_set_server=utf8mb4配置MySQL服务器,并将characterEncoding保留在Connector / J连接字符串之外。

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

希望这有帮助!