1. 程式人生 > >MySQL的Illegal mix of collationsy異常原因和解決方法

MySQL的Illegal mix of collationsy異常原因和解決方法

ear 代碼 clear 今天 tag 類型 資料 bsp net

原創 2008年12月25日 11:54:00

今天在使用數據庫臨時表的遊標時,發現了這個異常。
經查找資料,最終結果。這裏和大家分享一下。 字符集問題還是一定要統一的才是最簡單的。

create temporary table temp2(mc1 varchar(20) default ‘‘,mc2 varchar(20)default ‘‘,mc3 varchar(20)default ‘‘,mc4 varchar(20)default ‘‘,mc5 varchar(20)default ‘‘,parentid varchar(20),levelnum int); -- 生成臨時表

declare mycur67 CURSOR for select concat(replace(space(levelnum-1),space(1),‘------‘),mc1,mc2,mc3,mc4,mc5) as mc,parentid as location from temp2;

異常信息為:
Illegal mix of collations for operation ‘concat‘

將concat的代碼去掉後面的部分內容,運行結果為
declare mycur67 CURSOR for select concat(replace(space(levelnum-1),space(1),‘------‘),mc1) as mc,parentid as location from temp2;

錯誤:Illegal mix of collations (utf8_general_ci,COERCIBLE) and (gb2312_chinese_ci,IMPLICIT) for operation ‘concat‘

可見,是2個字段的編碼類型不一致造成的。



原來我的數據庫創建時,選擇的是gb2312編碼,而字段操作默認為UTF8的編碼。 絕對統一使用UTF-8

create temporary table temp2(mc1 varchar(20) default ‘‘,mc2 varchar(20)default ‘‘,mc3 varchar(20)default ‘‘,mc4 varchar(20)default ‘‘,mc5 varchar(20)default ‘‘,parentid varchar(20),levelnum int)DEFAULT CHARSET=UTF8;

運行結果正常。

經查找資料,如下說的很清楚
mysql> show variables like "%character%"; show variables like "%collation%"; +--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | latin1 |
| character_set_results | latin1 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
7 rows in set (0.00 sec)

+----------------------+-------------------+
| Variable_name | Value |
+----------------------+-------------------+
| collation_connection | latin1_swedish_ci |
| collation_database | latin1_swedish_ci |
| collation_server | latin1_swedish_ci |
+----------------------+-------------------+
3 rows in set (0.00 sec)

fix it with

set collation_database=utf8_general_ci;
set collation_connection=utf8_general_ci;
set collation_server=utf8_general_ci;

MySQL的Illegal mix of collationsy異常原因和解決方法