character-set-server 是 MySQL 服务器的核心字符集配置参数,它决定了新建数据库、表、列时的默认字符集,以及客户端连接的默认字符集。


一、核心作用

  1. 新建数据库的默认值:创建数据库时若不指定字符集,将使用此值

  2. 新建表的默认值:建表时未指定字符集,将继承数据库字符集(最终追溯到此值)

  3. 连接字符集:客户端未指定字符集时,服务器将使用此值进行通信

特别注意:修改此参数不会影响已存在的数据库、表和列,仅对新创建的对象生效。


二、推荐配置值

强烈推荐使用 utf8mb4 (完整 UTF-8 支持)

[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci  # 推荐,更精准的排序

为什么不选 utf8

  • MySQL 的 utf8 是伪 UTF-8,只支持 3 字节,无法存储 emoji 和某些生僻字

  • utf8mb4 支持完整的 4 字节 UTF-8,包括 emoji、生僻汉字等


三、配置方法

方法 1:修改配置文件(推荐)

编辑 MySQL 配置文件(通常是 my.cnfmy.ini):

[mysqld]
# 设置服务器默认字符集
character-set-server = utf8mb4
# 设置默认排序规则(重要!)
collation-server = utf8mb4_unicode_ci

# 其他相关推荐配置
init_connect = 'SET NAMES utf8mb4'  # 兼容旧连接
skip-character-set-client-handshake  # 强制使用服务器字符集(慎用)

配置文件位置参考 :

  • Linux: /etc/my.cnf, /etc/mysql/my.cnf

  • macOS: /usr/local/etc/my.cnf

  • Windows: C:\ProgramData\MySQL\MySQL Server X.X\my.ini

方法 2:启动参数(临时)

mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci

四、验证配置

1. 查看服务器变量

-- 查看服务器字符集设置
SHOW VARIABLES LIKE 'character_set_server';
SHOW VARIABLES LIKE 'collation_server';

-- 查看所有字符集相关变量(更全面的检查)
SHOW VARIABLES LIKE 'character%';

理想输出 :

+------------------------+---------+
| Variable_name          | Value   |
+------------------------+---------+
| character_set_server   | utf8mb4 |
| collation_server       | utf8mb4_unicode_ci |
+------------------------+---------+

2. 查看数据库/表字符集

-- 查看数据库字符集
SELECT SCHEMA_NAME, DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME 
FROM information_schema.SCHEMATA;

-- 查看表字符集
SHOW TABLE STATUS LIKE 'your_table_name';

五、最佳实践

✅ 推荐配置

  1. 新安装必做 :首次安装 MySQL 后立即配置 utf8mb4

  2. 全链路统一:确保服务器、客户端、连接、结果字符集一致

  3. 应用层指定 :在应用连接字符串中明确指定字符集

# Java JDBC 示例
jdbc:mysql://localhost:3306/db?useUnicode=true&characterEncoding=utf8mb4

# Python SQLAlchemy 示例
mysql+pymysql://user:pass@host/db?charset=utf8mb4

⚠️ 注意事项

  1. 已有数据谨慎操作 :修改字符集不转换已有数据,需要手动 ALTER TABLE 转换

  2. 性能微小影响 :utf8mb4 使用 4 字节,索引长度会变大(InnoDB 索引上限 3072 字节)

  3. 排序规则选择 :

    • utf8mb4_unicode_ci:Unicode 标准,排序精确,性能稍低

    • utf8mb4_general_ci:性能稍好,但某些排序不准确

    • utf8mb4_0900_ai_ci:MySQL 8.0+ 默认,基于 Unicode 9.0,性能最佳


六、常见问题处理

Q1: 修改后中文还是乱码?

解决步骤 :

  1. 确认 character_set_server 已改为 utf8mb4

  2. 检查当前会话字符集:SHOW VARIABLES LIKE 'character_set_%';

  3. 确保客户端、连接、结果字符集统一:SET NAMES utf8mb4;

  4. 检查应用连接字符串是否指定了正确的 charset

Q2: 如何转换已有表到 utf8mb4?

-- 逐个表转换(会锁定表,大表需谨慎)
ALTER TABLE your_table CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- 批量生成转换 SQL
SELECT CONCAT('ALTER TABLE `', TABLE_NAME, '` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;') 
FROM information_schema.TABLES 
WHERE TABLE_SCHEMA = 'your_database';

Q3: MySQL 8.0 还需要配置吗?

MySQL 8.0+ 已默认 utf8mb4,但建议 显式配置 以:

  • 确保一致性

  • 防止被配置文件其他位置覆盖

  • 便于团队协作和维护


七、完整配置示例

[mysqld]
# 基础字符集配置(必读)
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci

# 客户端连接相关(推荐)
init_connect = 'SET NAMES utf8mb4'

# MySQL 5.7 及以下可能需要(8.0+ 已废弃)
# default-character-set = utf8mb4

[mysql]
# 客户端工具默认字符集
default-character-set = utf8mb4

[client]
# 客户端连接默认字符集
default-character-set = utf8mb4

修改配置后,务必重启 MySQL 服务:

# Linux
sudo systemctl restart mysqld

# macOS (Homebrew)
brew services restart mysql

# Windows
net stop mysql
net start mysql

总结:始终使用 utf8mb4 作为 character-set-server,并确保应用层和数据库层字符集一致,这是避免乱码问题的根本之道。