Illegal mix of collations (gbk_chinese_ci,IMPLICIT) and (utf8_general_ci,COERCIBLE) for operation '='
本質:SQL 語句中涉及的列/參數/字面量字符集校對規則不一致,MySQL 無法隱式轉換。
// GB2312 → UTF-8
$utf = iconv('gb2312', 'utf-8', $_REQUEST['keyword']);
// UTF-8 → GB2312
$str = iconv('utf-8', 'gb2312//TRANSLIT', $str);
適用:歷史項目編碼不統一、無法修改數據庫字符集時的快速修復。
-- 修改表默認字符集(僅影響新建列)
ALTER TABLE `category` DEFAULT CHARACTER SET utf8 COLLATE utf8_bin;
-- 修改具體列字符集(會重建表,大表慎用)
ALTER TABLE `category` MODIFY `nickname` VARCHAR(50) CHARACTER SET utf8 COLLATE utf8_bin;
建議全庫統一 utf8mb4 + utf8mb4_unicode_ci(或 utf8mb4_0900_ai_ci)。
-- 原語句
SELECT * FROM {$tablepre}members WHERE nickname = '$nickname';
-- 加 BINARY 強制二進制比較,忽略校對規則
SELECT * FROM {$tablepre}members WHERE nickname = BINARY '$nickname';
或顯式指定:
WHERE nickname COLLATE utf8_bin = 'value' COLLATE utf8_bin
SHOW VARIABLES LIKE 'collation%'; 確認服務器/庫/表/連接字符集。SHOW CREATE TABLE tbl_name; 確認列字符集。SET NAMES utf8mb4 / PDO DSN charset=utf8mb4。