首页 > 数据库 > MySQL > 课时5-字符集和权限安全----字符集组合
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/ ,如需转载,请注明出处,否则将追究法律责任。