字符集
字符编码概念
字符是各种文字和符号的总称,包括各国家文字、标点符号、图形符号、数字等。
在计算机中所看到的任何内容都是字符构成的。
字符编码是计算机针对各种符号,在计算机中的一种二进制存储代号
字符集概念
字符(Character)是各种文字和符号的总称,包括各国家文字、标点符号、图形符号、数字等。字符集(Character set)是多个字符的集合,字符集种类较多,每个字符集包含的字符个数不同,常见字符集名称:ASCII字符集、GB2312字符集、BIG5字符集、 GB18030字符集、Unicode字符集等。计算机要准确的处理各种字符集文字,就需要进行字符编码,以便计算机能够识别和存储各种文字。中文文字数目大,而且还分为简体中文和繁体中文两种不同书写规则的文字,而计算机最初是按英语单字节字符设计的,因此,对中文字符进行编码,是中文信息交流的技术基础。
设置客户端所有字符集
如果直接通过cmd下的mysql.exe进行中文数据插入,那么可能会出错
出错原因 :
- 用户是通过mysql.exe来操作mysqld.exe
- 真正的sql执行是mysqld.exe来执行
- mysql.exe将数据传入mysqld.exe的时候,没有告知其对应的符号规则(字符集),而mysql也没有能力自己判断,就会使用自己默认的(字符集)
解决方案
mysql.exe客户端在进行数据操作之前将自己所使用的字符集告诉mysqld
cmd下的mysql.exe默认都只有一个字符集:GBK
mysql如何告知mysql.exe对应的字符集类型为gbk?
快捷方式:set name 字符集
让mysql.exe告知mysqld.exe自己的字符集规则
重新进行数据插入:中文(GBK)
深层原理:客户端,服务器,连接层
mysql.exe与mysqld.exe之间的处理关系一共分为三层
客户端传入数据给服务器:client:character_set_client
服务器返回数据给客户端:server:character_set_results
客户端与服务器之间的连接:connection: character_set_connection
set names字符集的本质就是一次性打通三层关系的字符集,变得一致
在系统中有三个变量来记录着这三个关系对应的字符集:
show variable like ‘char actor_set%’
查看一个新的客户端的对应的字符集关系
对比如图
修改服务器端变量的值
set 变量名=值
我们可以发现插入可以完成,输出时乱码
此时,修改结果字符集为gdk
发现已经能正确识别中文
connection只是为了更方便客户端进行字符集转换而设
总结
set names gbk
等价于
set character_set_client = gbk //为了让服务器识别客户端发来的数据
set character_set_connection = gbk //更好的帮助客户端与服务端之间进行字符集转换
set character_set_results= gbk //为了告诉客户端服务器所有的返回的数据字符集