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
字符集;
③ 服务器接收到的字符集就是~connectio
n设定的字符集了;
执行一条查询语句时
① ② ③ 过程和上面一致;
④ 返回查询结果:按照~results
的编码返回,如果没有设置,就按照~server
的编码格式返回;
3. mysql乱码及其解决
综上,向mysql中插入数据时,原则上只要~connection
和~database
二者字符集不冲突就不会出现乱码问题。~client
反而不会有什么影响,但是一般插入的数据本来就在本地,所以为了正常显示,三者通常都是相同的编码格式。
提问:执行查询语句时,返回的结果会转为~client
吗?如果不转的&~results
和~client
又不一样的话岂不是会看到乱码?
答:亲测不影响,应该是有转化的:
字符集更改操作
按照set character_set_aaa=bbb
的规则进行更改,则变量~aaa
会被修改为bbb
字符集。注意,这个操作仅针对当次mysql运行有效,重启之后还是会变回默认的(个人比较推荐这样更改)。
永久性更改字符集设置:看这个吧