GitHub 在 2026-10-30 公布 GHSA-grfq-r75j-rw9x(CVE-2026-119281):MariaDB Connector/J 一直按 UTF-8 解结果集,却只拦住了 character_set_client 被改走的情况。character_set_results 若被切到非 UTF-8,旧驱动仍继续用,字符串会 silently 解歪。修到 org.mariadb.jdbc:mariadb-java-client 3.5.11(同线还有 3.4.5 / 3.3.7)后,会话一改成 latin1 就关连接。Spring Boot 4.1.2 + Hikari 对照:3.5.10 还开着,中文已变成 ????;3.5.11 抛 SQLNonTransientConnectionException,连接直接断。
许可证 LGPL-2.1。仓库 mariadb-corporation/mariadb-connector-j。主源见上述 GHSA、3.5.11 Release Notes(CONJ-1379)以及 3.5.11 标签。
场景
业务库本身是 utf8mb4。某段初始化脚本、兼容旧报表的存储过程,或运维在会话里执行了:
SET SESSION character_set_results = 'latin1';
驱动侧若仍按 UTF-8 去读返回字节,非 ASCII 会先变问号,后续校验、拼接、落库都可能建立在歪掉的字符串上。官方写明:驱动本来就会在 character_set_client 被改走时关连接;3.5.11 起对 character_set_results 用同一套规则,只接受 utf8 / utf8mb3 / utf8mb4(或空值表示不做转换)。
公告还补了一刀:跟踪列表不再拼服务器全局的 session_track_system_variables,连接初始化时显式要求跟踪 character_set_client 与 character_set_results,避免服务器侧关掉跟踪后静默改字符集。
Boot 4.1.2 双进程对照
同一台机器、JDK 21.0.12.1、MariaDB 11.4。两个独立 Spring Boot 4.1.2 可执行 jar,只钉不同的 mariadb-java-client,都走默认 Hikari。连上后执行同一条 SET SESSION character_set_results = 'latin1',再 SELECT '中文校验'。
<dependency>
<groupId>org.mariadb.jdbc</groupId>
<artifactId>mariadb-java-client</artifactId>
<version>3.5.10</version> <!-- 或 3.5.11 -->
</dependency>
3.5.10(摘录):
BOOT=4.1.2 DRIVER=3.5.10
CONNECTED=true
BEFORE csr=utf8mb4
EXEC SET character_set_results=latin1
SET_OK=true
AFTER s=???? csr=latin1
STILL_OPEN=true
3.5.11(摘录):
BOOT=4.1.2 DRIVER=3.5.11
CONNECTED=true
BEFORE csr=utf8mb4
EXEC SET character_set_results=latin1
2026-11-01T08:11:41.335+08:00 WARN ... com.zaxxer.hikari.pool.ProxyConnection : HikariPool-1 - Connection org.mariadb.jdbc.Connection@5fac521d marked as broken because of SQLSTATE(08000), ErrorCode(0)
java.sql.SQLNonTransientConnectionException: Connection character_set_results was changed to 'latin1'. Only utf8 / utf8mb3 / utf8mb4 are supported. The connection has been closed.
CAUGHT=java.sql.SQLNonTransientConnectionException
MSG=Connection character_set_results was changed to 'latin1'. Only utf8 / utf8mb3 / utf8mb4 are supported. The connection has been closed.
旧版:SET 成功,会话 csr=latin1,中文读成 ????,连接还开着。新版:会话跟踪一报到 latin1,驱动立刻关连接;Hikari 把这条标成 broken,业务侧收到 SQLNonTransientConnectionException(SQLState 08000)。
同一驱动、不用 Boot 的纯 JDBC 进程复现一致:3.5.10 仍是 SET_OK=true / AFTER s=????;3.5.11 在 SET 当下就抛同一句异常,不会再读到问号串。
升级时注意
若代码或中间件仍会把结果集字符集改成 latin1 / gbk 一类,升到 3.5.11 后会变成硬失败,而不是静默乱码。该留 UTF-8 系,就别改 character_set_results;必须兼容旧客户端时,把改字符集的路径先清掉,再升驱动。
同日还公开了几条同包公告(长度字段截断、OK 包分配等),修复版本落在 3.5.10 / 3.5.11 与对应 3.4 / 3.3 分支。本次只对照 character_set_results 拒连这一条行为变化。
一起交流
分享你的思考,让讨论更进一步。