基础SELECT查询触发排序规则不兼容错误求助
各位大佬,我在执行一个简单的SELECT查询时碰到了排序规则不兼容的致命错误,卡了好一会儿没解决,来求助大家!
错误信息如下:
[21-May-2025 20:20:52 America/New_York] PHP Fatal error: Uncaught PDOException: SQLSTATE[HY000]: General error: 1267 Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (utf8mb4_0900_ai_ci,COERCIBLE) for operation '=' in /home/server/public_html/api/v1/0.50/includes.php:196 Stack trace: #0 /home/server/public_html/api/v1/0.50/includes.php(196): PDOStatement->execute(Array) #1 /home/server/public_html/api/v1/0.50/em...
问题原因
这个错误说白了就是查询里用来做等于比较的两个对象(字段和参数,或者两个字段)用了不一样的字符集和排序规则——一个是latin1_swedish_ci,另一个是utf8mb4_0900_ai_ci,数据库没法直接完成这个比较操作。
几个可行的解决办法
我整理了几个常用的方案,你可以根据自己的情况选:
临时转换排序规则(快速临时解决):在查询里把其中一方转换成和另一方匹配的规则,比如如果你的表字段是latin1编码,而传入的参数是utf8mb4的,可以这么写SQL:
SELECT * FROM your_table WHERE CONVERT(your_column USING utf8mb4) COLLATE utf8mb4_0900_ai_ci = :your_param要是反过来就转换参数那边的编码就行。不过要注意,这种临时转换可能会让字段索引失效,小数据量用用没问题,数据量大的话得谨慎。
统一表/字段的字符集(一劳永逸):把涉及到的表或者字段统一改成相同的字符集(强烈推荐用utf8mb4,能支持更多特殊字符和 emoji)。比如修改单个字段的命令:
ALTER TABLE your_table MODIFY COLUMN your_column VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;修改整个表的命令:
ALTER TABLE your_table CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;划重点!修改前一定要备份好数据,避免出现乱码翻车!
检查数据库连接字符集:确保你的PHP PDO连接时设置了正确的字符集,比如在DSN里加上
charset=utf8mb4,或者连接成功后执行SET NAMES utf8mb4;,这样传入的参数编码就能和数据库保持一致了。示例连接代码:$pdo = new PDO('mysql:host=localhost;dbname=your_database;charset=utf8mb4', 'your_username', 'your_password');
内容来源于stack exchange

