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运行有效,重启之后还是会变回默认的(个人比较推荐这样更改)。
永久性更改字符集设置:看这个吧
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
2022-01-08 if cv2.waitkey(10) & 0xFF = ord('s')