MySQL的字符编码体系(一)——数据存储编码

本文深入探讨MySQL中的数据存储字符编码配置,包括四个层次:服务器级、数据库级、数据表级和列级。并介绍了如何设置及修改这些层级的字符编码。

安装MySQL好多次了,每次都会纠结于数据库的字符编码配置,所以我决定这一次彻底把它理清。

MySQL的字符编码结构比较细,它大方向分为两个部分:数据存储编码和数据传输编码。本篇讨论数据存储编码部分,数据传输编码在下一篇MySQL的字符编码体系(二)——数据传输编码中讨论。


编码层次

数据存储的字符编码配置是指定数据库中存储的数据默认采用什么字符编码。默认字符编码的设置分为四个层次:服务器级、数据库级、数据表级和列级。也就是说,可以为服务器设置一个默认字符编码,再为服务器中的每一个数据库设置不同的默认编码,再为同一个数据库中的每一个数据表设置不同的默认编码,再为同一个数据表中的每一个列设置不同的默认编码。


MySQL数据库服务器的逻辑结构

那这四个层次的编码设置到底如何起作用呢?如果新建数据库时没有指定字符编码,就默认设置为服务器的编码;如果新建数据表时没有指定任何编码,就默认设置为数据库的编码;如果向数据表添加新列或新建数据表时没有特别指定某些列的编码,那么这些列就默认设置为数据表的编码。注意这里四个层次的编码都是作为“默认”的存在,用户创建数据库、表或增加列时直接指定的编码是最优先的。

另一方面,直接改变这四个层次的编码并不会改变它们各自所有下层对象的当前编码。比如修改只Server级,那么所有已经存在的数据库的默认编码不变,数据表、表列以及每一行现有数据记录的字符编码都不变,但是如果新建一个数据库且不指定其默认编码,那它的默认编码就会被设置为Server的默认编码;同样即使修改了所有四个层次的编码,但是数据表中每一条现有记录的字符字段仍然是按原来的编码存储的,但是如果向数据表中新插入一条记录,数据库将根据数据表当前各列的默认编码来存储该条记录的各个字符字段。

设置方法

修改Server以下各级编码的SQL语句如下:

ALTER {DATABASE | SCHEMA} [db_name] [DEFAULT] CHARACTER SET [=] charset_name
ALTER TABLE dbl_name [DEFAULT] CHARACTER SET [=] charset_name
ALTER TABLE dbl_name MODIFY [COLUMN] col_name {CHAR[(length)] | TEXT} CHARACTER SET charset_name

注意上面第三条修改列字符编码,实际上是通过完全重新定义列属性的方式实现的,语法跟创建新数据表时指定列字段属性一样的。所以如果这里只是想修改列字符编码,那就必须完整地写上创建该列时使用的所有定义修饰。

修改Server默认编码可以通过运行时直接修改变量character_set_server实现,但这样是临时性的,客户端关闭重启后又会自动恢复。要想永久改变Server默认编码需要在my.ini或my.cnf配置文件的“[mysqld]”区域中设定该变量的值,然后重启服务器:

[mysqld]
character_set_server=charset_name


### 如何在 MySQL 中设置字符编码 #### 当前字符编码查看 为了确保正确操作,在调整字符编码之前,可以先查询当前的字符编码设置。可以通过执行以下 SQL 命令来获取相关信息: ```sql SHOW VARIABLES LIKE 'character_set_%'; SHOW VARIABLES LIKE 'collation%'; ``` 这些命令会返回系列变量及其对应的值,帮助确认当前环境中的字符集和校对规则配置[^1]。 --- #### 修改全局字符编码 对于服务器级别的字符编码设置,可以在 `my.cnf` 或 `my.ini` 文件中进行更改。以下是针对不同版本的具体方法: ##### **MySQL 8.0 及以上** 从 MySQL 8.0 开始,推荐使用 UTF-8 的扩展版——`utf8mb4` 来支持更广泛的字符集(如表情符号)。需要编辑配置文件并添加如下内容: ```ini [mysqld] character-set-server=utf8mb4 collation-server=utf8mb4_unicode_ci [client] default-character-set=utf8mb4 [mysql] default-character-set=utf8mb4 ``` 完成修改后,需重启 MySQL 服务以使更改生效[^3]。 ##### **MySQL 5.x 版本** 如果是较早版本,则可以直接指定 `utf8` 字符集即可满足大部分需求。同样是在配置文件中定义参数: ```ini [mysqld] port=3306 basedir=/path/to/mysql/ datadir=/path/to/data/ max_connections=200 character-set-server=utf8 default-storage-engine=INNODB [mysql] default-character-set=utf8 [client] port=3306 default-character-set=utf8 ``` 注意:这里的路径 `/path/to/mysql/` 和 `/path/to/data/` 需要替换为实际安装位置[^4]。 --- #### 数据库层面的字符编码设定 创建新数据库时也可以显式声明其使用的字符集。例如: ```sql CREATE DATABASE my_database CHARACTER SET utf8 COLLATE utf8_general_ci; -- 如果是 MySQL 8.0 推荐使用: CREATE DATABASE my_database CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; ``` 这步骤有助于保持致性,防止后续数据存储过程中发生意外转换或丢失信息[^2]。 --- #### 表级与字段级字符编码调整 除了整体性的变更外,还可以单独为目标对象定制化字符集属性。比如新建张表的时候这样写: ```sql CREATE TABLE example_table ( id INT PRIMARY KEY, name VARCHAR(255), description TEXT ) DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; ``` 或者更新已有结构: ```sql ALTER TABLE existing_table CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; ``` 这种局部控制方式适用于特定场景下的优化需求[^2]。 --- #### 客户端连接时同步字符集 即使完成了上述所有步骤,仍需要注意客户端程序发起请求时所携带的字符集选项是否致。通常情况下可通过初始化语句强制统标准: ```sql SET NAMES utf8mb4; ``` 此指令告知服务器接下来交互过程应遵循该模式解析字符串输入输出[^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值