触发器中用到了STRCMP函数来比较字符串,结果在执行到该函数的时候,遇到了如下错误:
ERROR 1267 (HY000): Illegal mix of collations (gbk_chinese_ci,IMPLICIT) and (gb2312_chinese_ci,COERCIBLE) for operation 'strcmp'比较的字符串确实有中文,如0=STRCMP(name,'小王'),这样的问题应该如何解决?

解决方案 »

  1.   

    字符集不统一
    show variables like 'char%'; 
      

  2.   

    mysql> show variables like 'char%';
    +--------------------------+----------------------------------------+
    | Variable_name            | Value                                  |
    +--------------------------+----------------------------------------+
    | character_set_client     | gb2312                                 | 
    | character_set_connection | gb2312                                 | 
    | character_set_database   | gb2312                                 | 
    | character_set_filesystem | binary                                 | 
    | character_set_results    | gb2312                                 | 
    | character_set_server     | gb2312                                 | 
    | character_set_system     | utf8                                   | 
    | character_sets_dir       | /usr/local/mysql/share/mysql/charsets/ | 
    +--------------------------+----------------------------------------+
    8 rows in set (0.00 sec)
      

  3.   

    SET NAMES gb2312
    NAME字段的字符集是什么
      

  4.   

    SET NAMES gb2312;可以在配置文件的CLIENT和MYSQLD下把默认字符集加进去,就不会再碰到这样的字符集的问题了。
      

  5.   

    你的表上的字符集是 gbk你需要在触发器上转换一下字符集按下贴中的方法检查一下。
    http://blog.csdn.net/ACMAIN_CHM/archive/2009/05/12/4174186.aspx
    MySQL 中文显示乱码
      

  6.   

    我的表中确实是gb2312_chinese_ci,
    但是我在触发器中用select into 语句将字段中的内容复制给了变量,
    在比较这个变量的时候,出现的这个问题。类似的例子如下:
    DECLARE v_name varchar(128);
    SELECT name INTO v_name FROM tbl WHERE id = NEW.id;
    IF 0 = STRCMP(v_name, '小王')
    这是什么情况呢?
      

  7.   

    DECLARE v_name varchar(128);
    SET NAMES gb2312;
    SELECT name INTO v_name FROM tbl WHERE id = NEW.id;
    IF 0 = STRCMP(v_name, '小王')
      

  8.   

    Illegal mix of collations (gbk_chinese_ci,IMPLICIT) and (gb2312_chinese_ci,COERCIBLE) for operation 'strcmp'
    而从错误中collations的先后顺序也可看出,
    IF 0 = STRCMP(v_name, '小王') 中,v_name是gbk_chinese_ci。但数据表tbl中的collation确实是gb2312_chinese_ci
      

  9.   


    是的,我照着试了,声明变量的时候如下:
    DECLARE v_type_formatID VARCHAR(16) CHARSET 'GB2312';但问题依旧,哎!
      

  10.   

    好了,现在可以了,触发器里生命字符串变量时后加CHARSET 'GB2312',没有问题,
    是我疏忽了一个变量忘加了!DECLARE v_name VARCHAR(16) CHARSET 'GB2312';这样就能解决,多谢诸位!