数码资讯
MySQL数据校验过程中的字符集问题处理
场景: 主图书馆数据库:UTF8字符集 图书馆数据库:GBK字符集 需求: 验证主数据是否一致,并修复它。 检查过程: 将连接到UTF8的主要图书馆,建立一个库连接到GBK,查询分开,并返回结果集的记录领域的比较。 显示结果: 数据检查与同一个汉字字符不一致。 原因分析: 主图书馆,因为连接的字符集
选购提示
关注价格、性能、续航、售后和真实使用场景,理性比较后再下单。
场景:
主图书馆数据库: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;
附图:
主图书馆数据库: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;
附图:
声明:本文内容用于数码产品信息整理与选购参考,具体价格、库存、售后政策以官方渠道和电商页面实时信息为准。