正确配置mysql字符集需统一服务端、客户端和应用层设置,推荐使用utf8mb4字符集和utf8mb4_unicode_ci排序规则。1. 在my.cnf或my.ini的[client]、[mysql]、[mysqld]节点添加default-character-set=utf8mb4、character-set-server=utf8mb4、collation-server=utf8mb4_unicode_ci,并启用skip-character-set-client-handshake防止客户端覆盖。2. 重启服务后通过SHOW VARIABLES验证character_set_server、character_set_database、character_set_client、character_set_connection均为utf8mb4。3. 创建数据库和表时显式指定CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci。4. 应用连接字符串中也需设置对应字符集,如JDBC的useUnicode=true&characterEncoding=utf8mb4,php pdo的charset=utf8mb4,PyMySQL的charset=’utf8mb4’。三者一致可避免乱码和存储失败问题。
在搭建 MySQL 环境时,正确配置字符集和排序规则对避免乱码、保证数据一致性非常重要。最关键的是统一客户端、服务端和数据库表的字符集设置,推荐使用 utf8mb4 字符集和 utf8mb4_unicode_ci 排序规则。
1. 配置 MySQL 服务端字符集
修改 MySQL 的配置文件(my.cnf 或 my.ini),在以下三个节点中添加字符集相关配置:
[client]
default-character-set = utf8mb4
[mysql]
default-character-set = utf8mb4
[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
skip-character-set-client-handshake = true
说明:
– utf8mb4 支持完整的 UTF-8 编码,能存储表情符号(如 emoji)等四字节字符。
– utf8mb4_unicode_ci 是推荐的通用排序规则,支持多语言比较。
– skip-character-set-client-handshake 可防止客户端覆盖服务端设置。
2. 验证字符集配置是否生效
重启 MySQL 服务后,登录执行以下命令查看当前设置:
SHOW VARIABLES LIKE ‘character_set%’;
SHOW VARIABLES LIKE ‘collation%’;
确认以下变量值为 utf8mb4:
- character_set_server
- character_set_database
- character_set_client
- character_set_connection
3. 创建数据库和表时指定字符集
即使服务端已配置默认字符集,建库建表时仍建议显式声明:
CREATE DATABASE mydb
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
CREATE table users (
id int PRIMARY KEY,
name VARCHAR(100)
) ENGINE=InnoDB
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
4. 应用连接层也要保持一致
应用程序连接 MySQL 时,需在连接字符串中指定字符集:
- JDBC: useUnicode=true&characterEncoding=utf8mb4
- PHP (PDO): charset=utf8mb4
- python (PyMySQL): charset=’utf8mb4′
确保连接使用的字符集与服务端一致,避免传输过程中出现编码转换问题。
基本上就这些。只要配置文件、数据库对象和应用连接三者统一使用 utf8mb4,就能有效避免中文乱码和特殊字符存储失败的问题。不复杂但容易忽略细节。