场景:
主图书馆数据库:UTF8字符集
图书馆数据库:GBK字符集

需求:
验证主数据是否一致,并修复它。

检查过程:
将连接到UTF8的主要图书馆,建立一个库连接到GBK,查询分开,并返回结果集的记录领域的比较。

显示结果:
数据检查与同一个汉字字符不一致。

原因分析:
主图书馆,因为连接的字符集是UTF8,汉字字符编码返回到UTF8格式;图书馆是GBK格式和程序通过字符串比较函数strcasecmp比较,明显不同的字符集编码,相同的字符有不同的值,所以结果肯定不相等。

进一步的分析:
那么,在这种情况下,应该使用什么样的字符集来建立连接呢GBK或UTF8。事实上,任何一个选择的字符集是好的,只要进入主数据库和备份数据库的字符集是一致的,唯一的区别是,如果客户选择的字符集和字符集是不一样的,可能导致无法正常显示字符,即乱码字符。

在设置客户端的特性的情况下,我们描述了三例详细说明:{这里的客户可以考虑SecureCRT }
注:绿色方框表示DB字符集,黄色方框表示连接字符集,橙色框表示客户机。
第一例:



在这种情况下,主库返回的字符编码GBK,和库返回的字符编码UTF8,所以会出现错误时进行现场校准。

第二例:



访问主数据库连接不变,用utf8连接到GBK的准备,所以数据库将返回数据库字符集GBK返回给客户端,然后客户端,相同的字符用GBK编码表示,因此二进制等效,校准结果的正确性。

第三例:



主库和备份库之间的连接都是UTF8。因此,对主库,字符代码返回给客户端由GBK转换为UTF8。在这个时候,主图书馆和备用库都是UTF8编码,以及检查结果的正确性。但由于客户端是GBK编码的字符的字符,返回的都是混乱的,但这并不影响结果的正确性。

修复:

因为选择访问任何主存储库相同的字符集不会影响校验的正确性,它会影响修复吗由于UTF8编码范围大于GBK编码,如果GBK连接用于访问UTF8编码数据库,它可能是汉字GBK部分不能表达。

我们在二例库主要是GBK,图书馆是UTF8,和UTF8是访问使用GBK。假设有在转成GBK UTF8过程的一部分字符丢失,当主库肯定是不一致的,有部分字符GBK不能表达。假定维修声明如下:

更新设置C1 = master_value C1 = slave_value和ID =

其中T代表表名称、ID是代表行的主键的值,这主要是master_value C1柱,和slave_value是图书馆C1列的值。在这一点上,slave_value已经因为UTF8变成了GBK丢失,所以语句执行最终影响0行记录,无法修复。



结论:

当客户机访问两个不同字符集库进行数据检查时,连接使用一组较大的字符:

< < < GB2312 GBK UTF8拉丁



附录:MySQL客户端和服务器的字符集编码转换过程

相关参数:

- character_set_client:字符集由客户端使用的源数据

- character_set_connection:连接层的字符集

- character_set_results:查询结果字符集

- character_set_database:设置当前选定的数据库的默认字符

- character_set_system:系统元数据(字段名等)的字符集

1。客户端请求服务器

1)将客户端的字符集转换为连接字符集。

2)将连接字符集转换为db中的字符集。



2。服务器将结果返回给客户机。

1)将DB的内部字符集转换为连接字符集。

2)将设置为character_set_results字符集的连接特点



三.设置字符集命令:设置名称字符编码

指定与服务器通信的客户机的字符集,包括请求和返回。

names'x'is等价集:

集character_set_client = x;

集character_set_results = x;

集character_set_connection = x;

附图: