emoji 表情符号保存问题

好的,我可以帮你整理一份针对 MySQL 字符集、排序规则问题及批量修改方法 的新人学习文档,结构清晰、示例完整,并涵盖 TP6/PHP 场景常见问题。


MySQL 字符集与排序规则学习指南(新手版)

1️⃣ 什么是字符集和排序规则(Collation)

  • 字符集(Character Set) :定义存储字符的编码方式,例如 utf8utf8mb4

    • utf8:MySQL 三字节 UTF-8,只能存储 BMP(基本多文种平面)字符。

    • utf8mb4:MySQL 四字节 UTF-8,支持所有 Unicode 字符,包括 emoji。

  • 排序规则(Collation) :定义字符比较和排序方式,例如 utf8_general_ciutf8mb4_general_ci

    • ci = case-insensitive(大小写不敏感)

    • cs = case-sensitive(大小写敏感)


2️⃣ 常见错误

2.1 SQLSTATE[HY000]: General error: 1267 Illegal mix of collations

  • 原因:查询条件中涉及的 两边字段/字符串的字符集或排序规则不一致

  • 例如:

    Crystal 复制代码
    SELECT * 
    FROM pack
    WHERE pack_number = 'ABC123';
    • pack_number 字段是 utf8_general_ci

    • 'ABC123' 是 PHP UTF-8(可能是 utf8mb4

      → 会报 1267 错误。


2.2 Lock wait timeout exceeded

  • 虽然不是字符集问题,但常在大事务里出现。

  • 原因:事务包裹大量更新/循环查询,导致表被长时间锁住。


3️⃣ 如何解决字符集问题

3.1 统一数据库、表和字段字符集

修改数据库默认字符集
复制代码
ALTER DATABASE your_database_name 
CHARACTER SET = utf8mb4 
COLLATE = utf8mb4_general_ci;
查看数据库下所有表
复制代码
SELECT TABLE_NAME 
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_SCHEMA = 'your_database_name';
批量生成表字符集修改语句
Crystal 复制代码
SELECT CONCAT('ALTER TABLE `', TABLE_NAME, '` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;') AS sql_statements
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = '数据库名'
  AND TABLE_TYPE='BASE TABLE';
  • 执行生成的 SQL,即可统一整个数据库所有表。
单独修改字段字符集(可选)
复制代码
ALTER TABLE `pack_2020` 
MODIFY `pack_number` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

3.2 临时解决方法(只在查询时使用)

复制代码
SELECT * 
FROM pack_2020 
WHERE pack_number COLLATE utf8mb4_general_ci = 'ABC123';
  • 适合临时查询或测试。

  • 不推荐在业务中大量使用,容易引起性能问题。


3.3 PHP/TP6 注意事项

  1. 数据库连接字符集

    复制代码
    // TP6 数据库配置
    'charset' => 'utf8mb4',
    'collation' => 'utf8mb4_general_ci',
  2. 避免循环里频繁查询数据库,尽量批量操作。

  3. 事务不要过大,避免锁超时。

  4. 队列任务中也要保持字符集一致性,避免异步写入出错。


4️⃣ 字符集检查与调试

  • 查看表字符集:
Crystal 复制代码
SHOW CREATE TABLE pack;
  • 查看字段字符集:
Crystal 复制代码
SELECT COLUMN_NAME, CHARACTER_SET_NAME, COLLATION_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA='your_database_name'
  AND TABLE_NAME='pack';

5️⃣ 批量修改数据库示例流程

  1. 确认数据库名:

    SELECT DATABASE();

  2. 查看所有表:

    SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='lazada100';

  3. 生成批量修改 SQL:

    SELECT CONCAT('ALTER TABLE ', TABLE_NAME, ' CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;')
    FROM INFORMATION_SCHEMA.TABLES
    WHERE TABLE_SCHEMA='lazada100';

  4. 执行生成的 SQL。

  5. 检查字段是否统一:

    SELECT COLUMN_NAME, CHARACTER_SET_NAME, COLLATION_NAME
    FROM INFORMATION_SCHEMA.COLUMNS
    WHERE TABLE_SCHEMA='lazada100';


6️⃣ 小结

  • 字符集统一 是解决 Illegal mix of collations 的根本方法。

  • utf8mb4_general_ci 是现代系统推荐方案。

  • 事务、循环查询 也是高并发系统中常见问题,要与字符集问题区分。

  • TP6/PHP 中要注意数据库配置和队列任务字符集一致。

相关推荐
jiayou648 小时前
KingbaseES 实战:深度解析数据库对象访问权限管理
数据库
李广坤1 天前
MySQL 大表字段变更实践(改名 + 改类型 + 改长度)
数据库
爱可生开源社区2 天前
2026 年,优秀的 DBA 需要具备哪些素质?
数据库·人工智能·dba
随逸1772 天前
《从零搭建NestJS项目》
数据库·typescript
加号33 天前
windows系统下mysql多源数据库同步部署
数据库·windows·mysql
シ風箏3 天前
MySQL【部署 04】Docker部署 MySQL8.0.32 版本(网盘镜像及启动命令分享)
数据库·mysql·docker
李慕婉学姐3 天前
Springboot智慧社区系统设计与开发6n99s526(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
数据库·spring boot·后端
百锦再3 天前
Django实现接口token检测的实现方案
数据库·python·django·sqlite·flask·fastapi·pip
tryCbest3 天前
数据库SQL学习
数据库·sql
jnrjian3 天前
ORA-01017 查找机器名 用户名 以及library cache lock 参数含义
数据库·oracle