天天看點

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

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

标簽:

mysql /

collation /

character /

variables /

database /

server

 今天在使用資料庫臨時表的遊标時,發現了這個異常。

經查找資料,最終結果。這裡和大家分享一下。 字元集問題還是一定要統一的才是最簡單的。

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)

+----------------------+-------------------+

| 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;

非學,無以緻疑;非問,無以廣識