在 Linux 上使用 MariaDB 出现“乱码 + 报错”,通常不是单一原因,而是 字符集配置不一致 导致的。下面按「常见原因 → 排查方法 → 解决方案」给你讲清楚。
例如:
utf8mb4latin1结果:
??? 或乱码Incorrect string valueSHOW CREATE DATABASE db_name;
SHOW CREATE TABLE table_name;
常见问题:
utf8mb4latin1utf8即使 MariaDB 没问题,终端也会显示乱码。
很多程序(PHP / Python / Shell)连库时没加:
SET NAMES utf8mb4;
SHOW VARIABLES LIKE 'character%';
SHOW VARIABLES LIKE 'collation%';
正常推荐结果:
character_set_server = utf8mb4
character_set_client = utf8mb4
character_set_connection = utf8mb4
character_set_database = utf8mb4
character_set_results = utf8mb4
SHOW CREATE TABLE your_table;
如果看到:
DEFAULT CHARSET=latin1
那就是元凶。
STATUS;
看 Conn. 一行字符集。
编辑配置文件(常见路径):
/etc/my.cnf
或
/etc/mysql/my.cnf
或
/etc/mysql/mariadb.conf.d/50-server.cnf
添加:
[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
[client]
default-character-set = utf8mb4
[mysql]
default-character-set = utf8mb4
重启:
systemctl restart mariadb
ALTER DATABASE db_name
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
ALTER TABLE table_name
CONVERT TO CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
SET NAMES utf8mb4;
或在程序中设置(如 Python):
conn.execute("SET NAMES utf8mb4")
| 报错 | 原因 |
|---|---|
Incorrect string value |
字段不支持该字符(如 emoji) |
????? |
客户端/服务端字符集不一致 |
Illegal mix of collations |
联表字符集/排序规则不同 |
永远统一使用
utf8mb4
不要用utf8(MariaDB 的 utf8 是假 utf8)
如果你愿意,可以把:
SHOW VARIABLES LIKE 'character%'; 输出贴出来,我可以直接帮你定位是哪一层出了问题。