MySQL 錯誤:1267 - Illegal mix of collations


https://learnku.com/articles/41546

 

 

、查詢 MySQL 的版本:
  SELECT VERSION();
2、查詢 MySQL 當前使用的字符集:   SHOW VARIABLES LIKE '%character%';
3、查詢指定數據庫的指定數據表的狀態信息(db_test 是數據庫,t_text 是數據表):   SHOW TABLE STATUS FROM `db_test` LIKE '%t_text%';
4、查看數據表的列信息:   SHOW FULL COLUMNS FROM t_text;
5、修改數據表 t_text 的字符集:   ALTER TABLE t_text DEFAULT CHARACTER SET utf8mb4;

6、修改數據表 t_text 中的 nickname 字段的字符集:   ALTER TABLE t_text CHANGE nickname nickname VARCHAR(256) CHARACTER SET utf8mb4 NOT NULL;

 

 

 

 

 

 

 

 

 

 

 

事情起因
今天在一個統計功能時候,因為用到聯表查詢語句時候 mysql 報錯了,錯誤提示為

1267 - Illegal mix of collations (utf8mb4_unicode_ci,IMPLICIT) and (utf8mb4_general_ci,IMPLICIT) for operation '='
根據錯誤提示,推斷可能是由於兩個表的字符集不一致導致的,接下來我開始了一步步的追蹤

分析過程
1. 首先,我希望查看一下數據庫的字符集,我使用了語句

show variables like "collation_database";
顯示結果為


然后,我想看看我查詢所用到的表的字符集和數據庫的字符集是否一致,我使用語句

show table status like 'xxxx'


這樣看來表和數據庫字符集編碼應該是相同的。
2. 既然表和數據庫字符編碼一致,那么應該是聯合查詢的表的字段字符集不一樣吧,帶着着這樣的疑問我繼續追蹤。
使用 sql 語句查詢一下其中一個表 a 的所有字段

SHOW FULL COLUMNS FROM a


在查詢另一個表 b 的所有字段

SHOW FULL COLUMNS FROM b

如上所示,現在問題找到了,就是字段的字符集編碼不一致.

解決辦法
原因找到后,就開始解決了。我找到了 3 種辦法解決
1. 改變表字段的編碼,使兩個表的字段編碼保持一致。(如果是聯合查詢一般更改語句 on xx.sn=xxx.sn 中 sn 字段)
2. 如果沒有權限更改表那么可以考慮用 CONVERT 如下

CONVERT(xxx.sn USING utf8) COLLATE utf8_general_ci=xxxx.sn
3. 也可以把兩個字段轉為二進制用

BINARY xxx.sn=BINARY xxxx.sn
方法點評
方法 1 最為直接。(這就要求我們創建數據庫和表的時候要注意,保持字符集編碼一致真的很重要!!)
方法 2 對於數據量較大的表不太適用,因為索引有可能沒法用到,導致查詢速度很慢。
方法 3 對於字符類型的字段很好用,但是如果字段是數字類型字符串(比如 98765432334 當做字符串來存到表的字段)則有可能得不到想要的結果。

我按照第 1 中方法改的(本人集運維開發與一身,公司窮,請不起運維),如果有更好的辦法,歡迎大家和我交流!

————————————————
原文作者:阿隆索逃跑了
轉自鏈接:https://learnku.com/articles/41546
版權聲明:著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請保留以上作者信息和原文鏈接。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM