mysql怎么存储 emoji?
在 MySQL 中存储 emoji 表情需要满足以下条件,因为 emoji 属于 Unicode 的 4 字节字符(UTF-8 MB4),而 MySQL 的默认 utf8 只支持 3 字节字符。以下是完整解决方案:
一、修改数据库配置(关键步骤)
1. 修改 MySQL 配置文件(永久生效)
打开 my.cnf 或 my.ini(根据操作系统),在 [mysqld] 部分添加:
[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
init_connect = 'SET NAMES utf8mb4'
2. 重启 MySQL 服务
# Linux 示例 sudo systemctl restart mysql # Windows 在服务管理器中重启
二、修改数据库/表/字段字符集
1. 修改数据库字符集
ALTER DATABASE your_database
CHARACTER SET = utf8mb4
COLLATE = utf8mb4_unicode_ci;
2. 修改表字符集
ALTER TABLE your_table
CONVERT TO CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
3. 修改字段字符集(如果表转换失败)
ALTER TABLE your_table
MODIFY your_column VARCHAR(255) CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
三、检查字符集状态
-- 查看数据库字符集
SHOW CREATE DATABASE your_database;
-- 查看表字符集
SHOW CREATE TABLE your_table;
-- 查看字段字符集
SHOW FULL COLUMNS FROM your_table;
四、客户端连接设置
在应用程序连接数据库时,必须指定字符集为 utf8mb4:
-
php
-
$pdo = new PDO( "mysql:host=localhost;dbname=your_db;charset=utf8mb4", "user", "password"); -
python
-
import pymysql conn = pymysql.connect( host='localhost', user='user', password='password', db='your_db', charset='utf8mb4') -
java
-
jdbc:mysql://localhost:3306/your_db?characterEncoding=utf8mb4
五、处理索引问题(重要!)
utf8mb4 的字符占 4 字节,可能导致索引长度超出限制(767字节):
-- 修改索引长度(例如从 VARCHAR(255) 调整为 VARCHAR(191))
ALTER TABLE `your_table`
MODIFY `your_column` VARCHAR(191) CHARACTER SET utf8mb4;
或启用 innodb_large_prefix(MySQL 5.7.7+ 默认开启):
SET GLOBAL innodb_file_format = Barracuda; SET GLOBAL innodb_file_per_table = ON; SET GLOBAL innodb_large_prefix = ON;
六、验证是否支持 emoji
INSERT INTO your_table (your_column) VALUES ('😊');
SELECT * FROM your_table;
常见问题排查
- 乱码或问号
-
检查客户端连接字符集是否为
utf8mb4 -
确保表/字段已正确转换
- 索引创建失败
-
减少字段长度(如
VARCHAR(191)) -
升级 MySQL 到 5.7.7+ 并开启
innodb_large_prefix
- MySQL 版本要求
- 必须使用 MySQL 5.5.3 或更高版本(早期版本不支持
utf8mb4)
总的来说要检查服务端,客户端所有相关字符集设置成utf8mb4。

发表评论
所有评论