Closed betwjp closed 7 years ago
cobar最新代码,com.alibaba.cobar.mysql.bio.MySQLChannel 类中用于处理服务端utf8mb4+客户端utf-8的处理逻辑时候,代码行数203行,方法: public BinaryPacket execute(RouteResultsetNode rrn, ServerConnection sc, boolean autocommit)
查看代码的注释: 如果后端MySQL服务器配置了character-set-server=utf8mb4, 并且数据库客户端要求使用uft8,我们将不发送客户端的字符集要求。
结合cobar上下文,按照这段解释实际的处理逻辑应该是:
if (!(this.charsetIndex == 45 && sc.getCharsetIndex() == 33))
sendCharset(sc.getCharsetIndex());
而源代码的逻辑为: if (this.charsetIndex != 45 && sc.getCharsetIndex() != 33)
按照后面的这个逻辑,假设服务端字符集为latin1,客户端设定的字符集为utf8,此时也不会执行:sendCharset(sc.getCharsetIndex()); 扩大了限制条件,麻烦作者check下该处理逻辑是否正确。
我们在应用中使用客户端mysql-connector-java 5.0.8, 第一次建立连接时,其字符集为latin1,执行sql查询语句,客户端此时指定的字符集为utf8,我们debug上面方法,发现其不会执行sendCharset,即不会重新设定字符集为utf8,而是保持latin1,导致出现字符中文乱码。
感谢指出,已修复。@ 1.2.8-SNAPSHOT
阿里效率就是高!非常快速
cobar最新代码,com.alibaba.cobar.mysql.bio.MySQLChannel 类中用于处理服务端utf8mb4+客户端utf-8的处理逻辑时候,代码行数203行,方法: public BinaryPacket execute(RouteResultsetNode rrn, ServerConnection sc, boolean autocommit)
查看代码的注释: 如果后端MySQL服务器配置了character-set-server=utf8mb4, 并且数据库客户端要求使用uft8,我们将不发送客户端的字符集要求。
结合cobar上下文,按照这段解释实际的处理逻辑应该是:
if (!(this.charsetIndex == 45 && sc.getCharsetIndex() == 33))
而源代码的逻辑为: if (this.charsetIndex != 45 && sc.getCharsetIndex() != 33)
按照后面的这个逻辑,假设服务端字符集为latin1,客户端设定的字符集为utf8,此时也不会执行:sendCharset(sc.getCharsetIndex()); 扩大了限制条件,麻烦作者check下该处理逻辑是否正确。
我们在应用中使用客户端mysql-connector-java 5.0.8, 第一次建立连接时,其字符集为latin1,执行sql查询语句,客户端此时指定的字符集为utf8,我们debug上面方法,发现其不会执行sendCharset,即不会重新设定字符集为utf8,而是保持latin1,导致出现字符中文乱码。