【问题标题】:Re-introduced "Unknown initial character set index" error?重新引入“未知的初始字符集索引”错误?
【发布时间】:2017-10-14 22:10:23
【问题描述】:

我有一个连接到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 Version: '8.0.0-dmr'mysqldb:8 docker 映像一起工作

是否有任何不涉及更新 JDBC 驱动程序的解决方法?这是mysqld 的回归吗?

【问题讨论】:

    标签: java mysql docker jdbc


    【解决方案1】:

    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 字符集,请将 MySQL 服务器配置为 character_set_server=utf8mb4,并将 characterEncoding 保留在 Connector/J 连接字符串之外。

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

    希望这会有所帮助!

    【讨论】:

    • 完美,修复了它。我选择使用命令行选项--character-set-server=latin1 --collation-server=latin1_swedish_ci,因为我不想创建配置文件并将其挂载到 docker 容器。
    • 乐于帮助@Freg
    • 编辑 my.ini 文件对我有用,但任何想法为什么瑞典语和拉丁语?似乎有点随意
    • 版本之间的变化太多了,所以目前无法指出具体原因!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 2018-11-01
    • 2013-02-14
    • 2019-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多