使用MySQL Connector/J读取utf8编码longtext列出现字符乱码问题咨询
MySQL Connector/J读取longtext编码异常遗漏配置排查点
- 修正JDBC连接编码参数
你当前使用的charSet参数不是MySQL Connector/J的官方标准配置项,正确配置需要新增两个参数:
prop.put("useUnicode", "true"); prop.put("characterEncoding", "utf8mb4");
也可以直接拼接在JDBC连接URL中,优先级更高:jdbc:mysql://" + dbServer + "/" +dbName + "?useUnicode=true&characterEncoding=utf8mb4"
注意这里要填utf8mb4和你数据库编码对齐,不要只填utf8,避免特殊字符转码异常。
- 升级驱动到稳定版本
如果使用的是5.1.38之前的Connector/J 5.x版本,对utf8mb4的支持存在已知缺陷,建议升级到最新的5.x稳定版或者8.x版本,避免底层转码bug。 - 校验数据写入阶段的编码正确性
你观测到ö的字节为0xF6(latin1编码),首先可以直接在MySQL端执行SQL验证存储的原始字节是否正确:
SELECT HEX(airborne1Data) FROM project WHERE 你的查询条件;
如果返回结果中ö对应的字节是F6而非utf8编码的C3B6,说明数据写入的时候就已经用错误的编码存进了数据库,哪怕字段是utf8编码也会出问题,需要先修正写入逻辑的编码配置,再重新写入数据才能解决。
- 校验连接排序规则配置
如果你的JDBC配置中显式指定了connectionCollation参数,确认该参数值为utf8mb4_general_ci(或者你使用的utf8对应排序规则),不要配置为latin1相关的排序规则。 - 排除下游输出环节的编码问题
如果上述配置都正确,确认你读取字符串后输出的终端/日志组件编码是否为utf8:比如开发工具控制台默认编码可能是GBK,会导致正确的utf8字符串输出显示乱码。你可以在Java代码中直接打印字符的字节验证:
// 取到的字符串变量为str byte[] bytes = str.getBytes(StandardCharsets.UTF_8); // 查看ö对应的字节是否为0xC3 0xB6,如果是则读取逻辑正确,问题出在输出环节
内容的提问来源于stack exchange,提问作者Kevin Gebhardt
相关产品推荐
相关产品推荐

