MariaDB已配置utf8mb4,插入emoji却报Error 1366错误求助
问题描述
1. 数据库字符集检查
MariaDB [outdoors]> show create database outdoors; | outdoors | CREATE DATABASE `outdoors` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci */ |
2. 表字符集检查
MariaDB [outdoors]> show create table backend_comment; | backend_comment | CREATE TABLE `backend_comment` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `geo` varchar(10) DEFAULT NULL, `content` varchar(250) NOT NULL, `img` varchar(100) DEFAULT NULL, `comment_id` int(11) DEFAULT NULL, `create_time` datetime(6) NOT NULL, `notify_id` bigint(20) NOT NULL, `to_id` int(11) DEFAULT NULL, `user_id` int(11) NOT NULL, PRIMARY KEY (`id`), KEY `backend_comment_notify_id_61aef760_fk_backend_notify_id` (`notify_id`), KEY `backend_comment_to_id_4dd23479_fk_auth_user_id` (`to_id`), KEY `backend_comment_user_id_1ab394ea_fk_auth_user_id` (`user_id`), CONSTRAINT `backend_comment_notify_id_61aef760_fk_backend_notify_id` FOREIGN KEY (`notify_id`) REFERENCES `backend_notify` (`id`), CONSTRAINT `backend_comment_to_id_4dd23479_fk_auth_user_id` FOREIGN KEY (`to_id`) REFERENCES `auth_user` (`id`), CONSTRAINT `backend_comment_user_id_1ab394ea_fk_auth_user_id` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci |
3. 测试插入操作及报错
执行插入语句:
MariaDB [outdoors]> insert into backend_comment (id, content, notify_id, user_id, create_time) values (1, 'insert emoji test 😊', 1, 1, NOW());
报错信息:
ERROR 1366 (22007): Incorrect string value: '\xF0\x9F\x98\x8A' for column
outdoors.backend_comment.contentat row 1
补充信息:服务器版本为10.11.8-MariaDB-0ubuntu0.24.04.1(Ubuntu 24.04)
问题原因及解决方法
数据库和表的字符集虽已设置为utf8mb4,但仍可能存在以下几个导致无法插入emoji的问题:
1. 会话连接字符集未配置为utf8mb4
MySQL/MariaDB中的utf8仅支持3字节字符,无法存储4字节的emoji。如果当前会话的连接字符集仍是utf8,就会触发插入报错。
解决步骤:
- 临时生效:执行以下SQL设置当前连接的字符集,之后重新测试插入
SET NAMES utf8mb4; SET CHARACTER SET utf8mb4;
- 永久生效:修改MariaDB配置文件(通常路径为
/etc/mysql/mariadb.conf.d/50-server.cnf或/etc/my.cnf),在[mysqld]和[client]段添加配置:
[mysqld] character-set-server = utf8mb4 collation-server = utf8mb4_unicode_ci [client] default-character-set = utf8mb4
修改后重启MariaDB服务:
sudo systemctl restart mariadb
2. 列级字符集未明确指定utf8mb4
即使表默认字符集是utf8mb4,个别列可能因历史修改未同步字符集,仍使用旧的utf8。
解决步骤:
先检查content列的字符集:
show full columns from backend_comment where field='content';
若列字符集不是utf8mb4,执行修改语句:
ALTER TABLE backend_comment MODIFY COLUMN content varchar(250) NOT NULL CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
3. 应用程序连接字符串未指定utf8mb4
如果是通过应用程序(如Django、Java等)插入数据,需确保连接字符串中明确指定charset=utf8mb4参数。以Django为例,数据库配置需添加:
DATABASES = { 'default': { # 其他配置项 'OPTIONS': { 'charset': 'utf8mb4', }, } }
内容的提问来源于stack exchange,提问作者叶同学
相关产品推荐
相关产品推荐

