ITPub博客

首页 > 数据库 > MySQL > 课时5-字符集和权限安全----字符集组合

课时5-字符集和权限安全----字符集组合

原创 MySQL 作者:小亮520cl 时间:2015-11-17 18:42:28 0 删除 编辑
MySQL字符集测试报告

 

1. 测试目的

以utf8、gbk、latin1为例探究应用端字符集编码、连接字符集编码和服务端存储字符集编码以及结果字符集编码对MySQL数据库中的数据完整性的影响。

 

2. 测试环境

OS: rhel6.4 (2.6.32-358.el6.x86_64)

MySQL: mysql-5.5.37

Python: python-2.6.6-36.el6.x86_64

Locale: LANG=en_US.UTF-8 (LC_*=en_US.UTF-8)

应用程序编码: utf8 (python script)

测试数据: “中国”

其他: u1用户密码为123456,对test下的所有表具有 SELECT,INSERT,DROP权限

 

3. 测试方案

根据MySQL中字符集的转换过程:

1) MySQL Server收到请求时将请求数据从character_set_client

转换为character_set_connection

2) 进行内部操作前将请求数据从character_set_connection转换为内部操作字符集,其确定方法如下:

a) 使用每个数据字段的CHARACTER SET设定值b) 若上述值不存在,则使用对应数据表的DEFAULT CHARACTER SET设定值

c) 若上述值不存在,则使用对应数据库的DEFAULT CHARACTER SET设定值

d) 若上述值不存在,则使用character_set_server设定值

3) 将操作结果从内部操作字符集转换为character_set_results

 


根据以上原理,分别设置应用端、连接、存储端、结果中的字符集为utf8、gbk、latin1进行全覆盖测试。由此得出共 81 = 3 * 3 * 3 * 3 个测试项(应用端3种、连接中3种、存储端3种、结果中3种,共81种组合),分别用来检测在各种组合下应用端是否会显示乱码。

然而,应用端显示是否乱码并不能说明数据的完整性,为此,为了验证数据的完整性,在每个测试中都通过crt连接到数据库分别运行以下语句进行检查:

1) SET NAMES utf8; SELECT * FROM t2;

2) SET NAMES gbk; SELECT * FROM t2;

3) SET NAMES latin1; SELECT * FROM t2;

 

具体如下:

应用端字符字集为utf8

character_set_client character_set_connection default character set
[table]
character_set_result 序号 tui直连set names测试[LANG=en_US.UTF-8] 应用程序端
[LANG=en_US.UTF-8]
utf-8 utf-8 utf-8 utf-8 1 utf8 [数据未被破坏] 正常显示
gbk 2 utf8 [数据未被破坏] 查询执行异常
latin1 3 utf8 [数据未被破坏] 乱码[??]
gbk utf-8 4 utf8 [数据未被破坏] 正常显示
gbk 5 utf8 [数据未被破坏] 查询执行异常
latin1 6 utf8 [数据未被破坏] 乱码[??]
latin1 utf-8 7 乱码[??] [数据被破坏] 乱码[??]
gbk 8 乱码[??] [数据被破坏] 乱码[??]
latin1 9 乱码[??] [数据被破坏] 乱码[??]
gbk utf-8 utf-8 10 utf8 [数据未被破坏] 正常显示
gbk 11 utf8 [数据未被破坏] 查询执行异常
latin1 12 utf8 [数据未被破坏] 乱码[??]
gbk utf-8 13 utf8 [数据未被破坏] 正常显示
gbk 14 utf8 [数据未被破坏] 查询执行异常
latin1 15 utf8 [数据未被破坏] 乱码[??]
latin1 utf-8 16 乱码[??] [数据被破坏] 乱码[??]
gbk 17 乱码[??] [数据被破坏] 乱码[??]
latin1 18 乱码[??] [数据被破坏] 乱码[??]
latin1 utf-8 utf-8 19 乱码[??] [数据被破坏] 乱码[??]
gbk 20 乱码[??] [数据被破坏] 乱码[??]
latin1 21 乱码[??] [数据被破坏] 乱码[??]
gbk utf-8 22 乱码[??] [数据被破坏] 乱码[??]
gbk 23 乱码[??] [数据被破坏] 乱码[??]
latin1 24 乱码[??] [数据被破坏] 乱码[??]
latin1 utf-8 25 乱码[??] [数据被破坏] 乱码[??]
gbk 26 乱码[??] [数据被破坏] 乱码[??]
latin1 27 乱码[??] [数据被破坏] 乱码[??]
gbk utf-8 utf-8 utf-8 28 数据未插入 插入执行异常
gbk 29 数据未插入 插入执行异常
latin1 30 数据未插入 插入执行异常
gbk utf-8 31 数据未插入 插入执行异常
gbk 32 数据未插入 插入执行异常
latin1 33 数据未插入 插入执行异常
latin1 utf-8 34 数据未插入 插入执行异常
gbk 35 数据未插入 插入执行异常
latin1 36 数据未插入 插入执行异常
gbk utf-8 utf-8 37 数据未插入 插入执行异常
gbk 38 数据未插入 插入执行异常
latin1 39 数据未插入 插入执行异常
gbk utf-8 40 数据未插入 插入执行异常
gbk 41 数据未插入 插入执行异常
latin1 42 数据未插入 插入执行异常
latin1 utf-8 43 数据未插入 插入执行异常
gbk 44 数据未插入 插入执行异常
latin1 45 数据未插入 插入执行异常
latin1 utf-8 utf-8 46 数据未插入 插入执行异常
gbk 47 数据未插入 插入执行异常
latin1 48 数据未插入 插入执行异常
gbk utf-8 49 数据未插入 插入执行异常
gbk 50 数据未插入 插入执行异常
latin1 51 数据未插入 插入执行异常
latin1 utf-8 52 数据未插入 插入执行异常
gbk 53 数据未插入 插入执行异常
latin1 54 数据未插入 插入执行异常
latin1 utf-8 utf-8 utf-8 55 数据未插入 encode()编码转换异常
gbk 56 数据未插入 encode()编码转换异常
latin1 57 数据未插入 encode()编码转换异常
gbk utf-8 58 数据未插入 encode()编码转换异常
gbk 59 数据未插入 encode()编码转换异常
latin1 60 数据未插入 encode()编码转换异常
latin1 utf-8 61 数据未插入 encode()编码转换异常
gbk 62 数据未插入 encode()编码转换异常
latin1 63 数据未插入 encode()编码转换异常
gbk utf-8 utf-8 64 数据未插入 encode()编码转换异常
gbk 65 数据未插入 encode()编码转换异常
latin1 66 数据未插入 encode()编码转换异常
gbk utf-8 67 数据未插入 encode()编码转换异常
gbk 68 数据未插入 encode()编码转换异常
latin1 69 数据未插入 encode()编码转换异常
latin1 utf-8 70 数据未插入 encode()编码转换异常
gbk 71 数据未插入 encode()编码转换异常
latin1 72 数据未插入 encode()编码转换异常
latin1 utf-8 utf-8 73 数据未插入 encode()编码转换异常
gbk 74 数据未插入 encode()编码转换异常
latin1 75 数据未插入 encode()编码转换异常
gbk utf-8 76 数据未插入 encode()编码转换异常
gbk 77 数据未插入 encode()编码转换异常
latin1 78 数据未插入 encode()编码转换异常
latin1 utf-8 79 数据未插入 encode()编码转换异常
gbk 80 数据未插入 encode()编码转换异常
latin1 81 数据未插入 encode()编码转换异常



character_set_client

character_set_connection

default character set
[table]

character_set_result

crt直连set names测试[LANG=en_US.UTF-8]

应用程序端
[LANG=en_US.UTF-8]

utf8 utf8    
utf8
utf8
utf8 [数据未被破坏]

正常显示
utf8
utf8  
gbk utf8
utf8 [数据未被破坏]

正常显示
utf8
gbk utf8
utf8
utf8 [数据未被破坏]

正常显示
utf8
gbk
gbk
utf8
utf8 [数据未被破坏]

正常显示








测试结果说明
在终端环境为en_US.UTF-8,脚本编码为utf8的情况下:
1) 从utf8或gbk编码无法转换为latin1编码,或者反过来
2) 只要从client端到把数据放入server端的链路中出现了latin1编码,都将破坏数据的完整性
3) 即使数据未被破坏,如果结果中的编码与应用程序端不一致,应用端将显示乱码
4) 数据未被破坏时,若查询结果编码为gbk会导致查询语句执行异常。
   提示:'utf8'codec can't decode bytes in position 0-1: invalid data。
5) 应用端编码为gbk时,插入语句将执行异常。
   提示:'utf8'codec can't decode bytes in position 31-32: invalid data。
6) 应用端编码为latin1时,encode函数将执行异常。
   提示:'latin-1'codec can't decode bytes in position 31-32: ordinal not in range(256)。

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/29096438/viewspace-1839939/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
毕业以后专业任职数据库工程师职位,itpub一直作为自己的笔记记录的地方,blog写的不详细,草书笔记,仅供参考!

注册时间:2013-09-12

  • 博文量
    529
  • 访问量
    1126950