以下内容来自对mysql官方文档和google搜索后的整理
查看我们字符相关的mysql系统变量
+--------------------------+---------------------------------------------------------+
| Variable_name | Value |
+--------------------------+---------------------------------------------------------+
| character_set_client | gbk |
| character_set_connection | gbk |
| character_set_database | utf8mb4 |
| character_set_filesystem | binary |
| character_set_results | gbk |
| character_set_server | utf8mb4 |
| character_set_system | utf8 |
| character_sets_dir | C:\Program Files\MySQL\MySQL Server 8.0\share\charsets\ |
+--------------------------+---------------------------------------------------------+
(不对齐算了)
然后我们要考虑它们分别影响着什么。
-----------------------------------------------------------
character_set_server
-----------------------------------------------------------
首先创建数据库时我们用 create database db1; 创建的数据库,其默认字符集,来自character_set_server指定的字符串。
而在某个数据库建表时,默认字符集和默认collate是数据库的默认值。没有在全局变量出现。
官网:https://dev.mysql.com/doc/refman/8.0/en/charset-server.html
假如不使用 create database db1 character set utf8; 之类的指定语句,默认字符集就是第一张图中character_set_server指定的字符集,然后这个character_set_server没有其它用途。
这里有个词,collation,就是指一系列规则,这些规则决定了字符之间如何比较大小,其实这对于中文字符应该没什么用,但是对于英文,至少可以决定a和A是否一个大小,也就是说,是否区分大小写。
官网:https://dataedo.com/kb/databases/mysql/default-databases-schemas
如何改变这个character_set_server呢,在命令行启动mysql服务时添加启动参数(不好,每次都要输一遍),或者修改配置文件(推荐),或者使用在连接服务器后修改(重启服务失效)。
这里有一个问题待考虑,就是多个客户程序与服务器连接,客户端1改变了服务器编码,客户端2是不是会出现问题??
-----------------------------------------------------------
character_set_database
-----------------------------------------------------------
那么character_set_database什么用呢?character_set_database决定了default database的存储字符集。当character_set_database和character_set_server不同,新建的数据库默认为character_set_server的编码。
官网:https://dev.mysql.com/doc/refman/8.0/en/charset-database.html
一个概念default database,就是在刚安装好的mysql输入show databases; 之后展示的数据库。
这些系统自带的数据库,mysql workbench里被隐藏了,default database据参考指其中四个:mysql、Information_schema、performance_schema和sys。
参考:https://dataedo.com/kb/databases/mysql/default-databases-schemas
-----------------------------------------------------------
character_set_client
character_set_connection
character_set_result
-----------------------------------------------------------
服务器和客户端的连接字符集,这个简单但是重要。
character_set_client特指你输入客户端按下回车后,发出的query或者什么命令,以什么方式编码发出。
character_set_connection指服务器收到客户端的,以character_set_client编码输入,在服务器收到后应该被转换成的编码,即将编码从character_set_client转换为character_set_connection。
为什么这么做?stackoverflow:https://stackoverflow.com/questions/16082480/what-is-the-purpose-of-character-set-connection。
有人问了,在select "a<b"的时候用,也就是基本跟collate有关系,charset没啥用,但collate基于charset吧。
现在我们知道,有这么一个转换的步骤。
character_set_result:好理解了,server返回内容的编码
官网:https://dev.mysql.com/doc/refman/8.0/en/charset-examples.html
-----------------------------------------------------------
其它
-----------------------------------------------------------
character_set_system:这个值总是utf8,不需要设置,是为存储系统元数据的字符集,来自博客,不一定靠谱。
其它:好理解的。