FGr*_*reg 5 java mysql jdbc docker
我有一个连接到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]
Run Code Online (Sandbox Code Playgroud)
我不拥有 Java 客户端应用程序的源代码,因此我无法轻松升级它正在使用的 JDBC 驱动程序(即mysql-connector-java-5.0.8-bin.jar)。
这是与之前mysqldb:8运行 mysqld 的 docker 镜像一起使用的Version: '8.0.0-dmr'
是否有任何不涉及更新 JDBC 驱动程序的解决方法来解决此问题?这是回归吗mysqld?
这里讲的是自8.0以来发生的变化,其中列出供您参考的一点是:
字符集支持
重要更改:默认字符集已从 latin1 更改为 utf8mb4。这些系统变量受到影响:
character_set_server 和 character_set_database 系统变量的默认值已从latin1更改为utf8mb4。
collation_server 和 collation_database 系统变量的默认值已从latin1_swedish_ci更改为utf8mb4_0900_ai_ci。
因此,除非指定显式字符集和排序规则,否则新对象的默认字符集和排序规则与以前不同。这包括数据库和其中的对象,例如表、视图和存储的程序。
保留以前的默认值的一种方法是使用文件中的以下行启动服务器my.cnf:
[mysqld]
character_set_server=latin1
collation_server=latin1_swedish_ci
Run Code Online (Sandbox Code Playgroud)
由于您正在运行 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
Run Code Online (Sandbox Code Playgroud)
在客户端,如果您想进行更改 - 希望这些应该足够了:
要在 Connector/J 中使用 4 字节 UTF-8 字符集,请使用 和 来配置 MySQL 服务器character_set_server=utf8mb4,并characterEncoding省略 Connector/J 连接字符串。
Connector/J 将自动检测UTF-8设置
希望这可以帮助!