Python中MySQL 5.5/5.6如何处理表情emoji等多字节字符?除了utf8mb4还有什么好办法?

Python中MySQL 5.5/5.6如何处理表情emoji等多字节字符?除了utf8mb4还有什么好办法?

20 回复

你是不是对 utf8 有什么误解,什么叫 utf8 不够用了?


直接说结论:必须用utf8mb4,没别的选择。

MySQL的utf8编码其实是个“残废版”,它只支持最多3个字节的字符,而emoji是4个字节的。utf8mb4才是真正的UTF-8实现。所以这不是“还有什么好办法”的问题,而是“只有这一个办法”。

具体操作分三步,缺一不可:

1. 修改数据库、表、字段的字符集

-- 修改数据库
ALTER DATABASE your_database CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;

-- 修改表
ALTER TABLE your_table CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- 或者修改特定字段
ALTER TABLE your_table MODIFY your_column VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

2. 修改MySQL连接配置 在Python连接MySQL时,必须指定字符集:

import pymysql

connection = pymysql.connect(
    host='localhost',
    user='your_user',
    password='your_password',
    database='your_database',
    charset='utf8mb4',  # 关键在这里
    cursorclass=pymysql.cursors.DictCursor
)

3. 检查MySQL配置(如果需要) 在my.cnf或my.ini中确认:

[client]
default-character-set = utf8mb4

[mysql]
default-character-set = utf8mb4

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

为什么没有替代方案?

  • 用base64或二进制存储:能存,但查询、索引全废了,等于自废武功
  • 用其他编码(如GBK):根本不可能支持所有emoji
  • 过滤掉emoji:这是逃避问题,不是解决方案

注意一个坑:改了utf8mb4后,原先VARCHAR(255)的字段可能只能存191个字符了,因为最大索引长度限制。如果遇到“Specified key was too long”错误,需要缩短字段长度或修改索引。

总结:别折腾了,老实上utf8mb4。

UTF-8 是变长编码,应该不会出现不太够的情况把

json_encode 可解

5.5 也有 mb4 吧

5.5 就有 mb4,还有一种方法就是入库前替换成英文别名

上次看了稀里糊涂的,貌似 utf8 是可变的?

utf8 类型只能容纳三个字节是 MySQL 独有的,utf8mb4 这种东西也是 MySQL 独有的,实际按照标准有 6 个字节可以用。至于说不够用了怎么办?再把页表掏出来用呗,最后再弄一个新的 uni-unicode 就完了

这个怎么替换? 指导一下?

刚百度了一下. json_encode 是 php 的? django 的话怎么用?

去 github 找轮子,笑脸替换成:smile:,要有个表才行

最保险,最方便,最一刀两断的是升级 mysql。5.6 就可以了支持 utf8mb4 了。

存成 blob

utf8mb4 可以

楼主描述不清楚导致楼上的可能有些什么误解。
表情四个字符,utf8 三个字节存储。
最优:换 utfmb4
程序:json 内容,然后正则处理
曲线救国:base64 解决任何一切编码问题 >_<

base64 拯救一切…

我以前用过 base64 编码再存

楼上说的 base64 是正解 我也这么干过

mysql 的 utf8mb4 是正常的 utf8,mysql 的 utf8 是早产儿先天残废,程序里面按 utf8 处理然后给 utf8mb4 存储才是正常途径。

mysql utf-8 真是坑了不少人

回到顶部