You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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.content at 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,提问作者叶同学

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 15:12:43