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

相关推荐
wal13145204 分钟前
Dify发布V1.13.1版本,Hologres 向量数据库支持、HITL 邮件 Markdown 渲染及多项安全加固
数据库·安全·dify
Leon-Ning Liu1 小时前
Oracle UNDO表空间文件误删除故障恢复
数据库·oracle
2301_776508721 小时前
用Python生成艺术:分形与算法绘图
jvm·数据库·python
cxr8281 小时前
PaperclipAI 组织关系与智能体协作指南
数据库·人工智能·架构·ai智能体·openclaw
@insist1232 小时前
数据库系统工程师-Armstrong 公理系统:函数依赖推理与候选码求解核心方法论(重点)
数据库·软考·软件设计师·软件水平考试
山峰哥2 小时前
查询优化案例:从慢查询到闪电般的查询速度
数据库·sql·性能优化·编辑器·深度优先
杨云龙UP3 小时前
Oracle ASM磁盘组空间分配与冗余理解
linux·运维·数据库·sql·oracle
微学AI3 小时前
一款数据库SQL防火墙:可以拦截99.99%,可以阻止恶意SQL
数据库·sql
2401_884563243 小时前
Python Lambda(匿名函数):简洁之道
jvm·数据库·python
haixingtianxinghai4 小时前
Redis真的是单线程吗?
数据库·redis·缓存