【MySQL】解法:遇到編碼問題(Illegal mix of collations )無法用「=」

當在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;

當設定完後,就可以順利的比對資料囉!


參考資料


 

~Copyright by Eyelash500~

IT技術文章EY*研究院
iT邦幫忙eyelash*睫毛
Blog睫毛*Relax
Facebook睫毛*Relax