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 中要注意数据库配置和队列任务字符集一致。

相关推荐
许彰午7 分钟前
从Oracle看MySQL聚簇索引的架构性缺陷与缓解之道
mysql·oracle·架构
AllData公司负责人35 分钟前
数据集成管理|AIIData数据中台实现MySQL、Hive、Oracle一键接入Doris
大数据·数据库·人工智能·hive·mysql·oracle·数据分析
Databend1 小时前
小 Bitmap,大优化:Databend 如何加速大规模集合聚合
大数据·数据库·sql
倔强的石头_1 小时前
KES 优化行为避坑指南-那条从没被质疑过的 LEFT JOIN,在迁 KES 时终于露馅了
数据库
Database_Cool_1 小时前
RAG 混合检索首选:阿里云 Lindorm 向量+全文一体化检索
数据库·阿里云·django·云计算
ByWalker_1 小时前
web应用技术—MyBatis入门
java·数据库·mybatis·lombok
指尖的爷1 小时前
Ubuntu 24.04 彻底关闭自动更新(桌面+服务器通用)
服务器·数据库·ubuntu
gcw10242 小时前
Cron专业工具:定时任务与开发办公的一站式在线工具箱
java·前端·数据库·工具·crontab·cron·spring cron
江华森2 小时前
Gephi 可视化 + NetworkX 网络分析——《釜山行》人物关系(三)
数据库·python
whaledown2 小时前
互联网大厂Java求职面试三轮提问详解(涵盖Spring Boot、微服务、Kafka等核心技术)
java·jvm·数据库·spring boot·微服务·面试·kafka