MYSQL数据库mysql数据校验过程中的字符集问题处理
《MYSQL数据库mysql数据校验过程中的字符集问题处理》要点: 场景: 需求: 校验过程: 显示结果: 原因分析: 进一步分析: 我们以客户端的字符集为例,详细说说三种情况:【这里的客户端可以认为是SecureCRT】 MYSQL入门 就是上述的情况,主库返回字符的GBK编码,备库返回字符的UTF8编码,因此进行字段比对,则会出现误差.MYSQL入门 第二种情况:MYSQL入门 MYSQL入门 访问主库的连接不变,备库连接由UTF8变为GBK,因此进行返回时,数据库会将DB的字符集转为GBK返回给客户端,那么对于客户端而已,相同字符都是通过GBK编码表示,因此二进制相等,校验结果正确.MYSQL入门 第三种情况:MYSQL入门 MYSQL入门 ?? 访问主库和备库的连接都是UTF8,因此对于主库而已,返回给客户端的字符编码由GBK转为UTF8,此时主库和备库都是UTF8编码,校验结果正确.但由于客户端实质是GBK编码方式显示,因此返回的汉字字符都是乱码,但不影响校验结果的正确性.MYSQL入门 修复:MYSQL入门 ????? 既然选择与主备库任一一个相同的字符集去访问,都不会影响校验结果的正确性,那么影响修复呢?由于UTF8的编码范围比GBK编码范围要大,因此若采用GBK连接访问UTF8编码DB,有可能出现部分字符GBK不能表示的情况.MYSQL入门 我们拿第二种情况说明,此时主库为GBK,备库为UTF8,使用GBK访问UTF8.假设存在UTF8转为GBK过程中部分字符丢失,这时候主备库肯定是不一致的,因为存在部分字符GBK无法表示. 假设修复语句如下:MYSQL入门 Update? t set c1=master_value? where? c1=slave_value? and id=?MYSQL入门 其中t表示表名,id是主键表示某一行,master_value为主库c1列的值,slave_value为备库c1列的值.此时,slave_value由于UTF8转为GBK已经丢失,因此语句执行最终影响0行记录,无法修复.MYSQL入门 ?MYSQL入门 结论:MYSQL入门 客户端访问两个不同字符集库进行数据校验时,连接采用表示范围更大的字符集.比如我们常用的字符集表示范围如下:MYSQL入门 Latin<gb2312<gbk<utf8MYSQL入门 ?MYSQL入门 附:mysql客户端与服务器通信时字符集编码转换流程MYSQL入门 相关参数:MYSQL入门 C character_set_client:客户端来源数据使用的字符集MYSQL入门 C character_set_connection:连接层字符集MYSQL入门 C character_set_results:查询结果字符集MYSQL入门 C character_set_database:当前选中数据库的默认字符集MYSQL入门 C character_set_system:系统元数据(字段名等)字符集 MYSQL入门 ?1.客户端请求服务器MYSQL入门 1)将client的字符集转为connection字符集MYSQL入门 2)将connection字符集转为DB内部的字符集MYSQL入门 ?MYSQL入门 ?2.服务器返回结果给客户端MYSQL入门 1)将DB内部字符集转为connection字符集MYSQL入门 2)将connection字符集转为character_set_results字符集MYSQL入门 ?MYSQL入门 3.设置字符集命令:set names 字符编码MYSQL入门 指定客户端与服务器通信的字符集,包括请求与返回.MYSQL入门 SET NAMES 'x'? 等价于:MYSQL入门 SET character_set_client = x;MYSQL入门 SET character_set_results = x;MYSQL入门 SET character_set_connection = x;MYSQL入门 附图:MYSQL入门 MYSQL入门 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |