首页 >> 基础教程

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`;

常见问题排查

  1. 乱码或问号

    • 检查客户端连接字符集是否为 utf8mb4

    • 确保表/字段已正确转换

  2. 索引创建失败

    • 减少字段长度(如 VARCHAR(191)

    • 升级 MySQL 到 5.7.7+ 并开启 innodb_large_prefix

  3. 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
备案号:蜀ICP备2023042032号-1