数据库、表、列排序规则一致仍出现排序规则混合错误求助
解决MySQL排序规则不兼容错误(1267)
出现1267: Illegal mix of collations错误,即使数据库、表、列的排序规则都是utf8mb4_unicode_ci,大概率是以下几个遗漏点:
PHP与MySQL的连接字符集未正确设置
这是最常见的原因:即使库表列都是utf8mb4编码,PHP连接MySQL时如果没指定utf8mb4字符集,驱动会默认使用utf8(实际是utf8mb3),导致SQL参数的排序规则被识别为utf8_general_ci,和表列的utf8mb4_unicode_ci冲突。
解决方式:- 用PDO的话,在DSN中添加
charset=utf8mb4,例如:mysql:host=localhost;dbname=your_db;charset=utf8mb4 - 用mysqli的话,连接后执行
mysqli_set_charset($conn, 'utf8mb4');,再额外执行SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci;确保排序规则一致
- 用PDO的话,在DSN中添加
json_decode后的字符串传递时未保证编码一致性
json_decode返回的是UTF-8编码字符串,但如果PHP环境存在隐性转码(比如默认字符集不是UTF-8),可能导致参数编码异常。可以用mb_detect_encoding()检查字符串编码,确保是UTF-8后再绑定参数。参数绑定类型不正确
绑定SQL参数时,确保使用字符串类型(比如PDO的PDO::PARAM_STR),避免驱动自动转换时出现编码或排序规则的偏差。验证连接的实际排序规则
执行SQL语句SHOW VARIABLES LIKE 'collation_connection';,查看当前连接的排序规则。如果结果是utf8_general_ci,说明连接设置未生效,需要重新调整连接配置。
内容的提问来源于stack exchange,提问作者Kenny Wyland
相关产品推荐
相关产品推荐

