Mysql編碼引起的Illegal mix of collations (utf8_unicode_ci,IMPLICIT) and (utf8_general_ci,IMPLICIT)錯誤

前幾天寫了個Mysql存儲過程,在本地環境能執行成功,但是Linux服務器裏卻報:

Illegal mix of collations (utf8_unicode_ci,IMPLICIT) and (utf8_general_ci,IMPLICIT)錯誤。

讓我很無解,我對比了這個錯誤相關的兩張表的編碼,發現字符序collation都是utf8_unicode_ci,就連兩表的連接查詢的字段也同樣是utf8_unicode_ci。

我再檢查了下數據庫的編碼,一樣是 CHARSET=utf8 COLLATE=utf8_unicode_ci,所以執行存儲過程報這個Illegal mix of collations (utf8_unicode_ci,IMPLICIT) and (utf8_general_ci,IMPLICIT)錯誤讓人很無解。

後來想起是不是Mysql的編碼和庫、表裏的不一致,用命令看了下

mysql> show variables where Variable_name like 'collation%';
+----------------------+-----------------+
| Variable_name        | Value           |
+----------------------+-----------------+
| collation_connection | utf8_general_ci |
| collation_database   | utf8_general_ci |
| collation_server     | utf8_unicode_ci |
+----------------------+-----------------+

裏面的collation有不一致,而mysql5.5默認的collation爲utf8_general_ci,查看服務器的my.cnf文件有配置

    [client]
    default-character-set=utf8
    [mysql]
    default-character-set=utf8
    [mysqld]
    character-set-server=utf8

可能是存儲過程執行中創建臨時表時collation用的是utf8_general_ci,造成創建臨時表和實際的兩張表字段collation不匹配才報的這個錯誤,那麼要真是這樣的話,就得配置my.cnf讓Mysql和我們的表的collation一樣,就可以了。

於是在my.cnf文件中修改成這樣:

    [client]
    default-character-set=utf8
    [mysql]
    default-character-set=utf8
    [mysqld]
    character-set-server=utf8
    collation_server=utf8_general_ci

重啓Mysql,再把存儲過程中的兩張表和字段全部使用utf8_general_ci,然後把數據庫也設置成utf8_general_ci,再執行存儲過程,OK!可以運行了


發佈了44 篇原創文章 · 獲贊 23 · 訪問量 16萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章