当前位置:  数据库>mysql

mysql数据校验过程中的字符集问题处理

    来源: 互联网  发布时间:2014-10-15

    本文导语:  场景:主库DB:utf8字符集备库DB:gbk字符集 需求:校验主备数据是否一致,并且修复 校验过程:设置主库连接为utf8,设置备库连接为gbk,分别进行查询,将返回的的结果集按记录逐字段比较。 显示结果:原本相同的汉字字符...

场景:
主库DB:utf8字符集
备库DB:gbk字符集

需求:
校验主备数据是否一致,并且修复

校验过程:
设置主库连接为utf8,设置备库连接为gbk,分别进行查询,将返回的的结果集按记录逐字段比较。

显示结果:
原本相同的汉字字符,数据校验认为不一致。

原因分析:
对于主库而已,由于建立连接的字符集为UTF8,则返回的汉字字符编码为UTF8格式;对于备库而言则是GBK格式,而程序中通过字符串比较函数strcasecmp进行比较,显然不同的字符集编码,相同的字符有不同的二进制,因此结果肯定不会相等。

进一步分析:
那么对于这种情况,建立连接应该采用哪种字符集呢?GBK or UTF8。其实选择任何一种字符集都是OK的,只要是访问主库和备库的字符集保持一致即可,唯一的区别在于,若选择的字符集与客户端的字符集不一致,可能导致无法正常显示字符,即字符显示为乱码。

我们以客户端的字符集为例,详细说说三种情况:【这里的客户端可以认为是SecureCRT】
备注:绿色框代表DB字符集,黄色框代表连接字符集,橙色框代表客户端
第一种情况:

就是上述的情况,主库返回字符的GBK编码,备库返回字符的UTF8编码,因此进行字段比对,则会出现误差。

第二种情况:

访问主库的连接不变,备库连接由UTF8变为GBK,因此进行返回时,数据库会将DB的字符集转为GBK返回给客户端,那么对于客户端而已,相同字符都是通过GBK编码表示,因此二进制相等,校验结果正确。

第三种情况:

   访问主库和备库的连接都是UTF8,因此对于主库而已,返回给客户端的字符编码由GBK转为UTF8,此时主库和备库都是UTF8编码,校验结果正确。但由于客户端实质是GBK编码方式显示,因此返回的汉字字符都是乱码,但不影响校验结果的正确性。

修复:

      既然选择与主备库任一一个相同的字符集去访问,都不会影响校验结果的正确性,那么影响修复呢?由于UTF8的编码范围比GBK编码范围要大,因此若采用GBK连接访问UTF8编码DB,有可能出现部分字符GBK不能表示的情况。

我们拿第二种情况说明,此时主库为GBK,备库为UTF8,使用GBK访问UTF8。假设存在UTF8转为GBK过程中部分字符丢失,这时候主备库肯定是不一致的,因为存在部分字符GBK无法表示。 假设修复语句如下:

Update  t set c1=master_value  where  c1=slave_value  and id=?

其中t表示表名,id是主键表示某一行,master_value为主库c1列的值,slave_value为备库c1列的值。此时,slave_value由于UTF8转为GBK已经丢失,因此语句执行最终影响0行记录,无法修复。

 

结论:

客户端访问两个不同字符集库进行数据校验时,连接采用表示范围更大的字符集。比如我们常用的字符集表示范围如下:

Latin


    
 
 

您可能感兴趣的文章:

  • mysql4.0升级到mysql5(4.1),解决字符集问题
  • Mysql 默认字符集设置方法(免安装版)
  • MySQL字符集的基本类型与统一字符集分析
  • linux下安装mysql字符集转换的问题
  • mysql字符集和数据库引擎修改方法分享
  • 基于mysql 5.5 设置字符集问题的详解
  • NOSQL iis7站长之家
  • mysql安装后添加gbk字符集的方法
  • mysql修改数据库编码(数据库字符集)和表的字符编码的方法
  • mysql 字符集的系统变量说明
  • mysql 常用设置 字符集编码、自动完成(自动提示)、监听外网ip
  • 修改mysql默认字符集的两种方法详细解析
  • 解析mysql 5.5字符集问题
  • mysql字符集和校对规则(Mysql校对集)
  • MySQL skip-character-set-client-handshake导致的一个字符集问题
  • 完美转换MySQL的字符集 解决查看utf8源文件中的乱码问题
  • Mysql5 字符集编码问题解决
  • MySQL字符集 GBK、GB2312、UTF8区别 解决MYSQL中文乱码问题
  • MySQL的字符集操作命令总结
  • 深入Mysql字符集设置 图文版
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • mysql中字符串和时间互相转换的方法(自动转换及DATE_FORMAT函数)
  • mysql中如何判断当前是字符 mysql判断字段中有无汉字
  • mysql查询字符串替换语句小结(数据库字符串替换)
  • mysql 里面的sql语句的连接字符是什么?急用!
  • php mysql转义特殊字符的函数有哪些?
  • php mysql转义特殊字符函数
  • 浅析MySQL之字符串函数
  • sqlserver、mysql获取连接字符串步骤
  • 用MySQL函数清除字符串首尾空白字符的方法
  • MySQL用户密码中的特殊字符叹号(!)的妙用
  • mysql中向表中某字段追加字符串的方法
  • MySQL 转义字符使用说明
  • MySQL数据入库时特殊字符处理详解
  • mysql截取的字符串函数substring_index的用法
  • mysql获取字符串长度函数(CHAR_LENGTH)
  • 深入MYSQL字符数字转换的详解
  • MySQL中随机生成固定长度字符串的方法
  • 烦人:用Java操纵mySQL数据库时的中文字符处理。
  • 解析在MYSQL语法中使用trim函数删除两侧字符
  • 批量替换 MySQL 指定字段中的字符串
  • 关于Mysql查询带单引号及插入带单引号字符串问题
  • mysql中如何查看最大连接数(max_connections)和修改最大连接数
  • 在 linux下输入"mysql"命令,进入mysql命令行,但出现“Can't connetc to local MySQL server thuough socket /var/lib/mysql/mysql.sock
  • Mysql查询错误:ERROR:no query specified原因
  • MySQL 重装MySQL后, mysql服务无法启动
  • php安装完成后如何添加mysql扩展
  • 为什么用linux安装盘安装了mysql后,启动mysql,提示找不到mysql.sock文件?
  • mysql中查询当前正在运行的SQL语句并找出mysql中运行慢的sql语句
  • 請教,在redhat linux7.2+mysql 中,系統提示mysql已啟動,網頁卻不能訪問mysql?
  • Myeclipse中自带Tomcat的JDBC连接池配置(mysql和mssql)
  • 求解释: useradd -g mysql mysql -d /home/mysql -s /sbin/nologin


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3