MySQL 服务器程序运行过程中会用到许多影响程序行为的变量,它们被称为 MySQL 系统变量

1.查看系统变量

SHOW VARIABLES [LIKE 匹配的模式];

SHOW VARIABLES LIKE ‘default_storage_engine’; 查看存储引擎
SHOW VARIABLES like ‘max_connections’; 查看允许最大连接数
SHOW VARIABLES LIKE ‘default%’; 支持模糊查询

2.设置系统变量

对于大部分系统变量来说,它们的值可以在服务器程序运行过程中进行动态修改而无需停止并重启服务器

1.启动命令行

  1. mysqld --default-storage-engine=MyISAM --max-connections=10

2.配置文件

  1. [server]
  2. default-storage-engine=MyISAM
  3. max-connections=10

3.系统变量的 作用范围

系统变量的 作用范围 的概念,具体来说 作用范围 分为这两种:
GLOBAL :全局变量,影响服务器的整体操作。
SESSION :会话变量,影响某个客户端连接的操作。(注: SESSION 有个别名叫 LOCAL )
在服务器启动时,会将每个全局变量初始化为其默认值(可以通过命令行或选项文件中指定的选项更改这些默认
值)。然后服务器还为每个连接的客户端维护一组会话变量,客户端的会话变量在连接时使用相应全局变量的当
前值初始化。
如果在设置系统变量的语句中省略了作用范围,默认的作用范围就是 SESSION 。

  1. 并不是所有系统变量都具有 GLOBAL SESSION 的作用范围。
  2. 有一些系统变量只具有 GLOBAL 作用范围,比方说 max_connections ,表示服务器程序支持同时最多有
  3. 多少个客户端程序进行连接。
  4. 有一些系统变量只具有 SESSION 作用范围,比如 insert_id ,表示在对某个包含 AUTO_INCREMENT 列的
  5. 表进行插入时,该列初始的值。
  6. 有一些系统变量的值既具有 GLOBAL 作用范围,也具有 SESSION 作用范围,比如我们前边用到的
  7. default_storage_engine ,而且其实大部分的系统变量都是这样的,
  8. 有些系统变量是只读的,并不能设置值。
  9. 比方说 version ,表示当前 MySQL 的版本,我们客户端是不能设置它的值的,只能在 SHOW VARIABLES 语句
  10. 里查看。

3.字符集和比较规则

1.字符集

  1. ASCII 字符集 (1个字节)
    1. 共收录128个字符,包括空格、标点符号、数字、大小写字母和一些不可见字符。
  2. ISO 8859-1 字符集 (1个字节)
    1. 共收录256个字符,是在 ASCII 字符集的基础上又扩充了128个西欧常用字符(包括德法两国的字母)
  3. GB2312 字符集(如果该字符在 ASCII 字符集中,则采用1字节编码。否则采用2字节编码。
    1. 收录了汉字以及拉丁字母、希腊字母、日文平假名及片假名字母、俄语西里尔字母。其中收录汉字6763个,其他文字符号682个。同时这种字符集又兼容 ASCII 字符集
    2. 这种表示一个字符需要的字节数可能不同的编码方式称为 变长编码方式 。比方说字符串 ‘爱u’ ,其中 ‘爱’ 需要用2个字节进行编码,编码后的十六进制表示为 0xCED2 , ‘u’ 需要用1个字节进行编码,编码后的十六进制表示为 0x75 ,所以拼合起来就是 0xCED275 。
  4. GBK 字符集 (同上)
    1. 字符集只是在收录字符范围上对 GB2312 字符集作了扩充,编码方式上兼容 GB2312 。
  5. utf8 字符集 (1~4个字节)
    1. 收录地球上能想到的所有字符,而且还在不断扩充。这种字符集兼容 ASCII 字符集,采用变长编码方式,编码一个字符需要使用1~4个字节
    2. utf8mb3 :阉割过的 utf8 字符集,只使用1~3个字节表示字符。

utf8mb4 :正宗的 utf8 字符集,使用1~4个字节表示字符。

2.字符集查看

SHOW (CHARACTER SET|CHARSET) [LIKE 匹配的模式];

3.比较规则查看

SHOW COLLATION [LIKE 匹配的模式]; SHOW COLLATION LIKE ‘utf8_%’;

后缀 描述
_ai 不区分重音
_as 区分重音
_ci 不区分大小写
_cs 区分大小写
_bin 以二进制 方式比较

4.各级别的字符集和比较规则

  1. 服务器级别

    SHOW VARIABLES LIKE ‘character_set_server’; SHOW VARIABLES LIKE ‘collation_server’;

系统变量 描述
character_set_server 服务器级别的字符集
collation_server 服务器级别的比较规则
  1. 数据库级别

    SHOW VARIABLES LIKE ‘character_set_database’; SHOW VARIABLES LIKE ‘collation_database ‘;

系统变量 描述
character_set_database 当前数据库的字符集
collation_database 当前数据库的比较规则

character_set_database 和 collation_database 这两个系统变量是只读的,我们不能通过修改这两个变量的值
而改变当前数据库的字符集和比较规则

  1. 表级别

如果创建和修改表的语句中没有指明字符集和比较规则,将使用该表所在数据库的字符集和比较规则作为该表的
字符集和比较规则

  1. 列级别

同一个表中的不同的列也可以有不同的字符集和比较规则

  1. 由于字符集和比较规则是互相有联系的,如果我们只修改了字符集,比较规则也会跟着变化,如果只修改了比较
  2. 规则,字符集也会跟着变化,具体规则如下:
  3. 只修改字符集,则比较规则将变为修改后的字符集默认的比较规则。
  4. 只修改比较规则,则字符集将变为修改后的比较规则对应的字符集

4.从发送请求到接收结果过程中发生的字符集转换:

客户端使用操作系统的字符集编码请求字符串,向服务器发送的是经过编码的一个字节串。
服务器将客户端发送来的字节串采用 character_set_client 代表的字符集进行解码,将解码后的字符
串再按照 character_set_connection 代表的字符集进行编码。
如果 character_set_connection 代表的字符集和具体操作的列使用的字符集一致,则直接进行相应操
作,否则的话需要将请求中的字符串从 character_set_connection 代表的字符集转换为具体操作的列
使用的字符集之后再进行操作。
将从某个列获取到的字节串从该列使用的字符集转换为 character_set_results 代表的字符集后发送到
客户端。
客户端使用操作系统的字符集解析收到的结果集字节串。
在这个过程中各个系统变量的含义如下:
|系统变量|描述| |:—:|:—:| | character_set_client |服务器解码请求时使用的字符集|
| character_set_connection |服务器处理请求时会把请求字符串从 character_set_client 转为
character_set_connection | | character_set_results |服务器向客户端返回数据时使用的字符集|