mariadb数据库中文写入是乱码-字符集配置

mariadb数据库中文写入是乱码-字符集配置

技术教程gslnedu2025-03-20 10:40:413A+A-

一、字符集和校对规则

在 MariaDB 中,字符集(Character Set)和校对规则(Collation)是确保数据正确存储和查询的关键配置,正确配置字符集可避免数据损坏和查询异常,避免乱码或者字符不兼容问题,是数据库设计的关键步骤。

  1. 字符集(Character Set)
    定义数据库支持的字符集合(如
    utf8mb4latin1),决定可存储的字符范围(如多语言支持)。
  2. 校对规则(Collation)
    定义字符的排序和比较规则(如是否区分大小写、重音敏感等)。每个字符集对应多个校对规则(如
    utf8mb4_general_ci)。

二、查看字符集与校对规则

1. 查看支持的字符集

SHOW CHARACTER SET;

# 过滤结果
SHOW CHARACTER SET LIKE 'utf8%';

输出示例

Charset    Description                 Default collation  
-----------------------------------------------------------
utf8mb4    UTF-8 Unicode               utf8mb4_general_ci  
latin1     cp1252 West European        latin1_swedish_ci

2. 查看支持的校对规则

SHOW COLLATION LIKE 'utf8mb4%';

输出示例

Collation            Charset    Id  Default  Compiled  
-------------------------------------------------------
utf8mb4_general_ci   utf8mb4    45  Yes      Yes  
utf8mb4_bin          utf8mb4    46           Yes

3. 查看当前配置

# 查看服务器级默认字符集
SHOW VARIABLES LIKE 'character_set_server';

# 查看数据库级字符集
SHOW CREATE DATABASE mydb;

# 查看表级字符集
SHOW CREATE TABLE users;

# 查看连接字符集(客户端与服务器交互设置)
SHOW VARIABLES LIKE 'character_set%';
SHOW VARIABLES LIKE 'collation%';

三、设置字符集

1.服务器级默认配置

修改配置文件(/etc/my.cnf/etc/my.cnf.d/server.cnf):

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

重启生效

sudo systemctl restart mariadb

2.创建数据库时指定

CREATE DATABASE mydb
    CHARACTER SET utf8mb4
    COLLATE utf8mb4_unicode_ci;

3.创建表时指定


CREATE TABLE users (
    id INT PRIMARY KEY,
    name VARCHAR(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci
    ) DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

4.修改已有数据库/表

-- 修改数据库字符集
ALTER DATABASE mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- 修改表字符集(仅新数据生效,已有数据需转换)
ALTER TABLE users CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

5.客户端连接配置

确保客户端连接时使用与服务器一致的字符集,可在配置文件中添加:

[client]
default-character-set = utf8mb4

或在连接时指定:

SET NAMES 'utf8mb4';

四、字符集推荐

1.优先选择utf8mb4

  • 支持范围:完整的 Unicode 字符(包括表情符号),避免 utf8 的阉割版问题。
  • 校对规则utf8mb4_unicode_ci:更准确的 Unicode 排序(推荐)。utf8mb4_general_ci:更快但排序稍粗略。

2.示例场景

场景

推荐字符集

校对规则

多语言网站

utf8mb4

utf8mb4_unicode_ci

仅英文内容

latin1

latin1_swedish_ci

需要区分大小写

utf8mb4_bin

按二进制比较(区分大小写)


五、常见问题

1.乱码问题

  • 原因:客户端、服务器、连接字符集不一致。
  • 解决:确保配置文件中 [mysqld][client] 的字符集一致。连接后执行 SET NAMES 'utf8mb4';

2.字符集转换失败

  • 错误示例
 1267 (HY000): Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (utf8mb4_unicode_ci,COERCIBLE)
  • 解决:统一相关表/列的字符集和校对规则。

3.Emoji 存储失败

  • 原因:使用 utf8 而非 utf8mb4
  • 解决:将字符集升级至 utf8mb4

六、操作总结

操作

命令示例

创建数据库指定字符集

CREATE DATABASE mydb CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

修改表字符集并转换数据

ALTER TABLE users CONVERT TO CHARSET utf8mb4 COLLATE utf8mb4_unicode_ci;

检查客户端连接字符集

SHOW VARIABLES LIKE 'character_set_connection';

修复乱码(连接时强制设置)

SET NAMES 'utf8mb4';


最佳实践

  • 统一字符集:从服务器到表、列,所有层级保持字符集一致。
  • 提前规划:在创建数据库时明确指定字符集,避免后续转换。
  • 测试验证:插入特殊字符测试存储和查询是否正常。
点击这里复制本文地址 以上内容由朽木教程网整理呈现,请务必在转载分享时注明本文地址!如对内容有疑问,请联系我们,谢谢!
qrcode

朽木教程网 © All Rights Reserved.  蜀ICP备2024111239号-8