當在MySQL中宣告一個變數,然後再拿來放到WHERE
條件比對,結果發生Error Code: 1267. Illegal mix of collations (utf8mb4_unicode_ci,IMPLICIT) and (utf8mb4_general_ci,IMPLICIT) for operation '='
。這是文字編碼問題,資料庫的編碼和外面變數資料不同,因此設定好變數編碼就沒有問題。
運作環境:
- MySQL Server: MySQL Community Server - GPL Version: 8.0.17
- MySQLWorkBench:Version: 8.0.17
前言
想要在MySQL中使用變數,以方便搜尋,不用在各個查詢句子中修改一堆參數。不過這時候就遇到問題了!
這邊使用變數語法「SET
」進行設定,設定好要搜尋的變數,這邊是要查詢的身分證字號,接著進行搜尋:
SET @user_id := 'F126000001';
SELECT * FROM CUSTOMER WHERE ID = @user_id;
SELECT * FROM CUSTOMER_EMAIL WHERE ID = @user_id;
不過卻無法搜尋,MySQL跳出這樣的錯誤訊息:
Error Code: 1267. Illegal mix of collations (utf8mb4_unicode_ci,IMPLICIT) and (utf8mb4_general_ci,IMPLICIT) for operation '='
解法
這是編碼的問題。
在MySQLWorkBench內輸入時,會給這串字為utf8mb4_general_ci
的編碼方式,而資料庫的設定是utf8mb4_unicode_ci
,因此兩個是不同的編碼集,也就無法進行等號的比對,所以需在SET
變數的時候也一併設定其編碼,這時加入COLLATE utf8mb4_unicode_ci
就沒有問題:
SET @user_id := 'F126000001' COLLATE utf8mb4_unicode_ci;
SELECT * FROM CUSTOMER WHERE ID = @user_id;
SELECT * FROM CUSTOMER_EMAIL WHERE ID = @user_id;
當設定完後,就可以順利的比對資料囉!
參考資料
- stack overflow:Illegal mix of collations (utf8mb4_unicode_ci,EXPLICIT) and (utf8_general_ci,COERCIBLE) for operation '='
~Copyright by Eyelash500~
IT技術文章:EY*研究院
iT邦幫忙:eyelash*睫毛
Blog:睫毛*Relax
Facebook:睫毛*Relax