PrestaShop升级新增数据库触发utf8mb4排序规则混用=操作错误求解决
报错原因说明
该报错是MySQL执行等值比较时触发的规则冲突:参与比较的两个字符串字段/值分别使用了不同的排序规则,其中utf8mb4_general_ci是MySQL 8.0之前版本的默认排序规则,utf8mb4_0900_ai_ci是MySQL 8.0及之后版本的默认排序规则。本次新增数据库时使用了新版本的默认规则,和原有业务库的旧规则不一致,跨库关联查询或字段比较时就会触发该错误。
可行解决方案
- 第一步:定位冲突SQL
你抛出的异常中已经打印了实际执行的SQL语句,先找到SQL中做=比较的字符串字段,确认两边字段所属的库/表分别使用的排序规则,可执行以下命令查看:
查看数据库排序规则:SELECT DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = '你的数据库名';
查看表字段排序规则:SHOW FULL COLUMNS FROM 你的表名; - 方案1:统一所有库表排序规则(推荐,可彻底解决问题)
优先和原有老业务库的排序规则保持一致,避免影响存量业务逻辑,以统一为utf8mb4_general_ci为例:- 修改数据库默认排序规则,后续新建表会自动继承:
ALTER DATABASE 你的数据库名 CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; - 修改已有表及表内所有字符串字段的排序规则:
ALTER TABLE 你的表名 CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
如果仅需要修改单个字段,执行:ALTER TABLE 你的表名 MODIFY COLUMN 字段名 字段类型(长度) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci 原有约束(如NOT NULL DEFAULT ''等);
- 修改数据库默认排序规则,后续新建表会自动继承:
- 方案2:SQL语句临时指定排序规则(适合改库表影响范围过大的场景)
不需要修改库表结构,只需要在冲突的比较逻辑中手动指定统一的排序规则即可,示例:SELECT * FROM table_a a JOIN table_b b ON a.name = b.name COLLATE utf8mb4_general_ci - 针对PrestaShop框架的补充配置
你当前使用的是PrestaShop系统,可直接修改配置文件app/config/parameters.php中的database_collation参数,设置为统一的排序规则,后续系统自动创建表时会默认使用该配置,不会再出现规则不一致的问题。
注意事项
- 新建库/表时主动指定排序规则,不要依赖数据库默认配置,避免后续MySQL版本升级再次触发该问题,示例建库语句:
CREATE DATABASE 新库名 CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;示例建表语句末尾加:ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; - 执行批量修改表结构操作前,务必提前备份全量数据,避免操作异常导致数据损坏。
内容的提问来源于stack exchange,提问作者Omar Chakroun
相关产品推荐
相关产品推荐

