Mysql中有哪些字符编码,以及其的作用和设置方式
前言 : 学习此篇文章最好先去了解字符编码,以及mysql中变量的相关知识。
查看mysql中有哪些字符编码
我们可以通过
SHOW (SESSION) VARIABLES LIKE 'character%';
来查看当前会话下的mysql中所有的字符编码设置,如下
也可以通过
SHOW GLOBAL VARIABLES LIKE 'character%';
来查看当前mysql服务器默认的全局字符编码设置
至于全局和回话系统变量的区别给出如下简单解释
- 全局系统变量为整个mysql服务器的设置,在mysql服务器启动时就会默认赋值
- 会话系统变量在mysql服务器启动时不存在,但是在mysql客户端与服务器建立起一个连接后就会对应全局系统变量生成会话相关的会话变量
例如:
当我们使用sqlyog或者其他mysql的图形化工具时,或者使用cmd命令通过 mysql默认客户端对mysql进行连接时都可以理解成一个会话
我们上图显示的全局和会话的字符编码设置不一样的原因是sqlyog在做连接是对其会话的变量做了修改,我们通过cmd方式也是一样,都会对该类变量的会话变量做修改,原因是不同的客户端编解码可能不一致,详细我们后面在说
数据库中数据存储相关字符编码
数据库级别
数据库级别就是我们的character_set_database 这个参数所控制的,也就是说我们如果在创建数据库时不指定对应字符编码那么数据库的字符编码就会默认为该参数所指定的编码如下所示
数据表级别
我们在刚刚创建了的数据库下创建表
我们可以看到数据表也默认继承了数据库的编码
这时候我们输入
insert into testchartable values("玩");
会提示以下错误
ERROR 1366 (HY000): Incorrect string value: ‘\xCD\xE6’ for column ‘id’ at row 1
我们可以通过下面两条语句对数据表做字符集的修改
创建表时
CREATE TABLE 表名 (列的信息) [[DEFAULT] CHARACTER SET 字符集名称] [COLLATE 比较规则名称]]
已有表
ALTER TABLE 表名 [[DEFAULT] CHARACTER SET 字符集名称] [COLLATE 比较规则名称]
使用
alter table testchartable CHARACTER SET utf8;
对该表做字符编码的重新设置
好了,这时候我们就发现表时utf8了但是字段的字符集还是拉丁,这时候如果继续插入同样会报错,这又是为什么呢
列级别的数据库字符编码设置
上图我们发现修改了数据表编码后字段还有一个编码,这时候我们就可以确定数据库中的数据编码最小粒度 列级别
如何对表中的列的字符做修改呢
ALTER TABLE 表名 MODIFY 列名 字符串类型 [CHARACTER SET 字符集名称] [COLLATE 比较规则名称];
这样就可以修改了
使用下面语句修改后
alter table testchartable modify id char character set utf8;
这时候我们在去插入数据就可以发现插入成功了
所以我们可以得出如下总结:
- 数据库服务器拥有默认字符编码通过character_set_database做修改
- 在此参数影响下后续创建数据库的编码都默认是该参数,同样数据表创建以及数据表中的擦混国家列也都为该参数的字符集
使用该类参数注意事项:
- 该类参数都在创建库,表,列时生效,如果有一个列,表,库中的字符已经为latin,这时候再想要去通过修改character_set_database或者数据库表等字符集都不会作用到你想要修改的表,库,列上,你必须对症下药.
- 建议默认将数据库服务器参数永久性设置改为utf8,后续就不会出错了
设置方法
找到你windows下安装的mysql服务器位置,将character_set_server=utf8
粘贴进去即可
我们通过net stop(start) mysql将mysql服务重启看查看会话变量和系统变量可以发现修改成功了
这时候你创建的库和表都默认为utf8的编码了
mysql客户端从请求到mysql服务器回应的字符编码变化
讲完上面数据库存储数据编码了我们就可以来看看mysql请求到响应过程的编码变化了
- character_set_client 服务器解码请求时使用的字符集
- character_set_connection 服务器处理请求时会把请求字符串从character_set_client 转为 character_set_connection
- character_set_results 服务器向客户端返回数据时使用的字符集
我们创建表test2
select * from test2 where name = “小明”;
我们通过该sql语句来探讨 “小明”字符编码的变化
大致流程如下
以上就是该文章全部的内容了,如果有不懂的请在评论区留言我会及时回复的。
结语:作者为大四菜狗一枚文笔不太行,这篇文章算处女作品,如果写得不好的地方可以提出谢谢大家观看
记得点个赞在走哟