MySQL 編碼問題

starzodiac
3 min readOct 20, 2021

Illegal mix of collations (utf8mb4_unicode_ci,IMPLICIT) and (utf8mb4_general_ci,IMPLICIT) for operation ‘=’ 的解法

最近碰到一個花了蠻多時間才解決的問題,一開始碰到的錯誤訊息如上,然後看了以下幾個 ref,依序把 database -> table -> column -> client 都檢查一遍:

但還是沒有找到原因,最後是把 view 砍掉再 create 後才成功解決這個問題,重點是去檢查 view 的時候,竟然顯示 collation 是 utf8mb4_unicode_ci

所以建議如果是錯在 view 的話,可以把 view 砍掉重練試試看

另外也順便介紹一下 character set 跟 collation 的關係,簡單來說比較像是:

  • character set 類似字典
  • collation 字典的目錄

如果字典一樣,但是目錄不一樣,就會發現兩邊查出來的位置不一致,就有機會報錯。還有一些特別的目錄可以讓不同的字判斷成同一個字(例如北歐有加重音符號的字)

最後放一下 utf8mb4_general_ci & utf8mb4_unicode_ci 之間的差異

簡單來說就是:

  • utf8mb4_general_ci 查詢比較快,但是建立在他沒有 follow utf8 的排序規則,所以不是通用的 utf8 collation

但是 DB 比較傾向 general purpose,所以強烈建議使用 utf8mb4_unicode_ci 來讓自己的坑越少越好

ref:

--

--