首页 >> 基础教程
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。
最新文章
InnoDB 和 MyISAM 主要有什么区别?2025-07-06
mysql存储引擎应该怎么选择?2025-07-06
mysql的几种存储引擎2025-07-06
MySQL 的段区页行2025-07-06
一条更新语句是如何执行的?2025-07-06
mysql中一条查询语句是如何执行的?2025-07-02
MySQL基础架构及执行流程解析2025-07-02
MySQL SQL语法树解析过程详解2025-07-02
mysql中SQL 的隐式数据类型转换?2025-07-01
MySQL 第 3-10 条记录怎么查?2025-06-30