前幾天寫了個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!可以運行了