alibaba / cobar

a proxy for sharding databases and tables
Apache License 2.0
3.21k stars 1.22k forks source link

cobar 字符集问题咨询 #79

Closed betwjp closed 7 years ago

betwjp commented 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)

sendCharset(sc.getCharsetIndex()); 

按照后面的这个逻辑,假设服务端字符集为latin1,客户端设定的字符集为utf8,此时也不会执行:sendCharset(sc.getCharsetIndex()); 扩大了限制条件,麻烦作者check下该处理逻辑是否正确。

我们在应用中使用客户端mysql-connector-java 5.0.8, 第一次建立连接时,其字符集为latin1,执行sql查询语句,客户端此时指定的字符集为utf8,我们debug上面方法,发现其不会执行sendCharset,即不会重新设定字符集为utf8,而是保持latin1,导致出现字符中文乱码。

hexianmao commented 7 years ago

感谢指出,已修复。@ 1.2.8-SNAPSHOT

betwjp commented 7 years ago

阿里效率就是高!非常快速