mysql字符集&编码问题

1. mysql各编码变量含义

使用show variables like 'character%'后检查出mysql中有若干编码:

● character_set_client
客户端来源数据使用的字符集,也就是客户端发过来的query使用的什么字符集
● character_set_connection
MySQL接受到query后,按照character_set_client将其转化为character_set_connection设定的字符集。
● character_set_database
当前选中数据库的默认字符集
● character_set_filesystem
文件系统的编码格式,把操作系统上的文件名转化成此字符集,即把 character_set_client转换character_set_filesystem, 默认binary是不做任何转换的。
● character_set_results
查询结果编码的字符集
● character_set_server
服务器安装时指定的默认编码格式,这个变量建议由系统自己管理,不要人为定义
● character_set_system
系统元数据(字段名等)字符集:这个值一直是utf8,不需要设置。
数据库系统使用的编码格式,它是为存储系统元数据(metadata)的编码格式。
● character_sets_dir
字符集安装目录
——参考:https://blog.csdn.net/peanutwzk/article/details/107869675

2. 执行sql语句时的编码转换

执行一条插入语句时

① 客户端输入语句中插入的字符串内容会按照~client的字符集进行编码;
② 传输过程:~client先转成~filesystem(一般就是binary)转成~connection字符集;
③ 服务器接收到的字符集就是~connection设定的字符集了;

执行一条查询语句时

① ② ③ 过程和上面一致;
④ 返回查询结果:按照~results的编码返回,如果没有设置,就按照~server的编码格式返回;

3. mysql乱码及其解决

综上,向mysql中插入数据时,原则上只要~connection~database二者字符集不冲突就不会出现乱码问题。~client反而不会有什么影响,但是一般插入的数据本来就在本地,所以为了正常显示,三者通常都是相同的编码格式。

提问:执行查询语句时,返回的结果会转为~client吗?如果不转的&~results~client又不一样的话岂不是会看到乱码?
答:亲测不影响,应该是有转化的:

字符集更改操作

按照set character_set_aaa=bbb的规则进行更改,则变量~aaa会被修改为bbb字符集。注意,这个操作仅针对当次mysql运行有效,重启之后还是会变回默认的(个人比较推荐这样更改)。

永久性更改字符集设置:看这个吧

posted @ 2023-01-08 15:19  YIYUYI  阅读(51)  评论(0编辑  收藏  举报