MariaDB/MySQL插入Unicode emoji部分显示为问号,遗漏了哪些配置?
问题根因
MySQL中官方自带的utf8字符集实际是utf8mb3,仅支持最长3字节的Unicode字符,你可以正常显示的⚡️刚好属于3字节字符,而👑、😜等无法显示的emoji均为4字节Unicode字符,超出了utf8mb3的支持范围,存储时会被截断转换为问号。
需要修改的配置项
- 数据库连接参数调整
原有连接代码中的charset参数值从utf8改为utf8mb4,修改后代码示例:mysql.connector.connect(host="localhost", user="root", password="****", database="dbname", charset='utf8mb4') - 连接后执行的编码设置调整
原有SET NAMES utf8;改为SET NAMES utf8mb4;,修改后代码示例:
若已经在连接参数中指定了mycursor = mydb.cursor() mycursor.execute("SET NAMES utf8mb4;") mydb.commit()charset='utf8mb4',该语句可以省略。 - MySQL服务端全局配置调整
编辑MySQL配置文件(Linux为my.cnf,Windows为my.ini),添加/修改以下配置后重启MySQL服务:
重启后可执行以下语句验证配置是否生效:[mysqld] character-set-server = utf8mb4 collation-server = utf8mb4_bin [client] default-character-set = utf8mb4 [mysql] default-character-set = utf8mb4SHOW VARIABLES LIKE '%char%'; SHOW VARIABLES LIKE '%collation%'; - 确认库、表、列全层级字符集配置
仅修改列的排序规则不生效,需确保数据库、表、对应列的字符集均为utf8mb4,可执行以下语句核对:-- 核对库字符集 SHOW CREATE DATABASE 你的库名; -- 核对表和列字符集 SHOW CREATE TABLE 你的表名;
注意:此前已经存储为问号的4字节emoji数据无法恢复,需要重新插入才可以正常显示。
内容的提问来源于stack exchange,提问作者miran80
相关产品推荐
相关产品推荐

