Azure
Azure
发布于 2024-04-15 / 10 阅读
0
0

mysql 字符编码篇

1、查看mysql有关字符编码设置

mysql> show variables like 'character_set_%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8mb4                    |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8mb4                    |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

2、参数释义

变量名

释义

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,不需要设置,它是为存储系统元数据的编码格式

character_sets_dir

这个变量是字符集安装的目录

3、参数作用范围解释

  • 数据库、表、列字段字符集的由来

    • 建库时,若未明确指定字符集,则采用character_set_server指定的字符集

    • 建表时,若未明确指定字符集,则采用当前库所采用的字符集

    • 新增、修改表字段时,若未明确指定字符集,则采用当前表所采用的字符集

  • 更新、查询涉及到得字符集变量

    • 更新流程,字符集转换过程:character_set_client-->character_set_connection-->表字段字符集

    • 查询流程,字符集转换过程:表字段字符集-->character_set_result

  • character_set_database

    • 当前默认数据库的字符集。比如:执行use xxdb;后,当前数据库变为xxdb,若xxdb的字符集为utf8,那么此变量值就变为utf8(供系统设置,无需人工设置)

4、字符编码转换原理

MySQL Server收到请求时将请求数据从 character_set_client 转换为 character_set_connection,进行内部操作前将请求数据从character_set_connection转换为内部操作字符集,步骤如下

  1. 使用每个数据字段的 CHARACTER SET 设定值;

  2. 若上述值不存在,则使用对应数据表的字符集设定值;

  3. 若上述值不存在,则使用对应数据库的字符集设定值;

  4. 若上述值不存在,则使用 character_set_server 设定值。

最后将操作结果从内部操作字符集转换为 character_set_results

字符编码转换示意图


评论