MySQL replication illegal mix of collations

MySQL replication case 一则

转载:http://www.vmcd.org/2013/09/mysql-replication-case-%E4%B8%80%E5%88%99/

Posted by admin on September 10th, 2013

最近同事处理了一则mysql复制错误.发出来参考下

MYSQL同步出错,报错信息如下:

?

Last_Errno: 1267

Last_Error: Error ‘Illegal mix of collations (utf8_general_ci,COERCIBLE) and (latin1_swedish_ci,IMPLICIT) for operation ‘concat‘‘ on query. Default database: ‘inshop_app‘. Query: ‘INSERT INTO inshop_app.app_sms_order_info (ORDER_CODE, ORDER_TIME, ORDER_AMOUNT, ORDER_CONTENT, BUY_NUM, ORDER_STATUS, MERCHANT_ID, CREATE_TIME, UPDATE_TIME, APP_TYPE, pay_time, remark)

        VALUES( NAME_CONST(‘my_order_code‘,_utf8‘SBY130830010708_F0‘ COLLATE ‘utf8_general_ci‘),NOW(),‘0‘,‘1次‘, NAME_CONST(‘my_sms_num‘,1125000),‘1‘, NAME_CONST(‘my_merchant_id‘,10708),NOW(),NOW(),‘2‘,NOW(),CONCAT (‘钻展赠送:‘, NAME_CONST(‘my_sms_num‘,1125000)))‘

出错原因分析:

此SQL在Master上执行时是这样的

?

INSERT INTO inshop_app.app_sms_order_info (ORDER_CODE, ORDER_TIME, ORDER_AMOUNT, ORDER_CONTENT, BUY_NUM, ORDER_STATUS, MERCHANT_ID, CREATE_TIME, UPDATE_TIME, APP_TYPE, pay_time, remark)

        VALUES( ‘SBY130830010708_F0‘,NOW(),‘0‘,‘1次‘, 1125000,‘1‘, 10708,NOW(),NOW(),‘2‘,NOW(),CONCAT (‘钻展赠送:‘, 1125000))

该SQL本身是没问题的,执行成功,但是MYSQL在记录BINLOG的时候,会对常量用NAME_CONST()函数进行“标识”
同步的报错就出现在这个地方

?

CONCAT (‘钻展赠送:‘, NAME_CONST(‘my_sms_num‘,1125000))

其中,’钻展赠送:’是UTF8字符集,NAME_CONST(‘my_sms_num’,1125000)得到的数值型常量被自动转型为LATIN1字符集,外层的CONCAT()函数不支持二种不同字符集进行连接,于是报错

以下测试可验证此分析:

无NAME_CONST()函数标识常量时,即如同在Master上执行时,成功

?

09:29:06 inshop_app> select concat(‘钻展赠送‘,123);

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

| concat(‘钻展赠送‘,123)     |

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

| 钻展赠送123                |

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

1 row in set (0.00 sec)

有NAME_CONST()函数标识常量时,即如同在Slave上执行时,失败

?

09:25:17 inshop_app> select concat(‘钻展赠送‘,name_const(‘colname‘,123));

ERROR 1267 (HY000): Illegal mix of collations (utf8_general_ci,COERCIBLE) and (latin1_swedish_ci,IMPLICIT) for operation ‘concat‘

报错与同步是一样的错误

什么情况下MySQL会自动加上NAME_CONST函数

测试1: 直接insert

?

11:27:32 test> insert into lengzhenguo_mha(c3,c4) values(1,‘a‘),(‘2‘,‘b‘);

Query OK, 2 rows affected (0.00 sec)

Records: 2  Duplicates: 0  Warnings: 0

BINLOG中的内容

?

#130909 11:28:35 server id 2009  end_log_pos 469        Query   thread_id=10    exec_time=0     error_code=0

SET TIMESTAMP=1378697315/*!*/;

insert into lengzhenguo_mha(c3,c4) values(1,‘a‘),(‘2‘,‘b‘)

/*!*/;

测试2: 简单的存储过程

?

13:16:42 test> create procedure p_test()

    -> begin

    -> insert into lengzhenguo_mha(c3,c4) values(10,‘abc‘),(‘20‘,‘xyz‘);

    -> commit;

    -> end

    -> $

Query OK, 0 rows affected (0.00 sec)

13:17:38 test> call p_test();

Query OK, 0 rows affected (0.00 sec)

BINLOG中的内容

?

#130909 13:18:21 server id 2009  end_log_pos 328        Query   thread_id=12    exec_time=0     error_code=0

use `test`/*!*/;

SET TIMESTAMP=1378703901/*!*/;

insert into lengzhenguo_mha(c3,c4) values(10,‘abc‘),(‘20‘,‘xyz‘)

/*!*/;

测试3:带参数的存储过程 类似bind value

?

13:22:43 test> CREATE procedure p_test_2 (i bigint, j varchar(30))

    -> begin

    ->  insert into lengzhenguo_mha(c3,c4) values(i,j);

    -> commit;

    -> end

    -> $

Query OK, 0 rows affected (0.00 sec)

13:23:16 test> call p_test_2(100,‘dba‘);

Query OK, 0 rows affected (0.00 sec)

13:25:10 test> call p_test_2(‘500‘,‘dba‘);

Query OK, 0 rows affected (0.00 sec)

BINLOG中的内容
#130909 13:23:32 server id 2009 end_log_pos 612 Query thread_id=12 exec_time=0 error_code=0

?

SET TIMESTAMP=1378704212/*!*/;

insert into lengzhenguo_mha(c3,c4) values( NAME_CONST(‘i‘,100), NAME_CONST(‘j‘,_latin1‘dba‘ COLLATE ‘latin1_swedish_ci‘))

/*!*/;

#130909 13:25:15 server id 2009  end_log_pos 1226       Query   thread_id=12    exec_time=0     error_code=0

SET TIMESTAMP=1378704315/*!*/;

insert into lengzhenguo_mha(c3,c4) values( NAME_CONST(‘i‘,500), NAME_CONST(‘j‘,_latin1‘dba‘ COLLATE ‘latin1_swedish_ci‘))

/*!*/;

注意:’500′在写入Binlog时,已经被转换成数值型了

目前已知的解决方法:

方法1:不要直接使用数值,直接给予字符串,建议使用此方法

?

09:25:27 inshop_app> select concat(‘钻展赠送‘,name_const(‘colname‘,‘123‘));

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

| concat(‘钻展赠送‘,name_const(‘colname‘,‘123‘))     |

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

| 钻展赠送123                                        |

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

1 row in set (0.00 sec)

注意:这里的123加引号,字符串~

方法2:先进行类型转换

?

09:56:32 inshop_app> select concat(‘钻展赠送‘,convert(name_const(‘colname‘,123) using utf8));

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

| concat(‘钻展赠送‘,convert(name_const(‘colname‘,123) using utf8))     |

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

| 钻展赠送123                                                          |

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

1 row in set (0.00 sec)

MySQL replication illegal mix of collations

时间: 2024-10-11 19:24:20

MySQL replication illegal mix of collations的相关文章

MySQL Error: Illegal mix of collations for operation 'concat'

在使用concat连接字符串时出现错误:MySQL Error: Illegal mix of collations for operation 'concat' 原因:字段操作默认为UTF8的编码,应该绝对统一使用UTF-8,而创建数据库时使用了其它编码.  解决方法:在Navicat for MySQL中删除掉原来的数据库,重新新建,新建时设置字符集和排序规则为UTF-8 MySQL Error: Illegal mix of collations for operation 'concat

mysql 字符集错误 Illegal mix of collations

SELECT * FROM     mobile_card.mcc_o2o_repayment_request orr         INNER JOIN     bi_o2o_sfq.CARD C ON C.CARDID = orr.cardno LIMIT 0, 50 Error Code: 1267. Illegal mix of collations (utf8_general_ci,IMPLICIT) and (utf8_unicode_ci,IMPLICIT) for operat

MySQL SQL error: #1271 - Illegal mix of collations for operation 'UNION'

MySQL在使用UNION查询时或者创建视图时报:异常:SQL error: #1271 - Illegal mix of collations for operation 'UNION',此类问题是由于UNION Mysql的Table的时候对应的字段Collation字符序不同导致的,如下图所示: 创建视图或者查询时采用UNION ALL报异常 通过WorkBench查看相关查询的表的详细信息发现字符类型的字段的Collation不同 通过修改字段的Collation解决此类错误,或者创建字

mysql: Illegal mix of collations (utf8_unicode_ci,IMPLICIT) and (utf8_general_ci,IMPLICIT) for operation '= 的解决

昨天把mysql里所有table的varchar字段的字符集,批量换成了utf8mb4/utf8mb4_unicode_ci ,以便能保存一些emoji火星文 , 结果有一个sql语句执行时,报错如下: Illegalmixofcollations(utf8_unicode_ci,IMPLICIT)and(utf8_general_ci,IMPLICIT)foroperation '= 观察了一下,这个sql使用了一个自定义的function,这个函数的入口参数为varchar,类似如下: CR

c#程序连接mysql,报"Illegal mix of collations (utf8_general_ci,IMPLICIT) and (utf8_unicode_ci,IMPLICIT) for operation '='"的解决方案

=============================================== 20170607_第一次修改                       ccb_warlock =============================================== 工作关系开发一个连接mysql的c#程序,交付测试后反应在连测试环境的数据库后出现报错且数据无法获取的情况.(如下图所示) 查到了http://www.cnblogs.com/xiaochaohuashengm

mysql : Illegal mix of collations (utf8_general_ci,IMPLICIT) and (utf16_general_ci,IMPLICIT) for operation '

mysql多表关联查询报错Illegal mix of collations (utf8_general_ci,IMPLICIT) and (utf16_general_ci,IMPLICIT) for operation ' 查了这两张表都是utf-8格式的,为什么还是不能查询,后来发现字段里的排序规则有一张表是utf-16的, 修改后即可查询 mysql : Illegal mix of collations (utf8_general_ci,IMPLICIT) and (utf16_gen

MySQL 报错:MySQL Illegal mix of collations for operation 'like'

MySQL Illegal mix of collations for operation 'like' 在 MySQL 5.5 以上, 若字段类型 Type 是 time,date,datetime 在 select时如果使用 like '%中文%' 会出现 Illegal mix of collations for operation 'like'在编程时要对每个字段进行查找, 在执行时可能就会出现时间字段 like '%中文%' 这种语法,在旧版的 MySQL 是不会出现错误的. 升到 M

mysql字符集问题 错误代码: 1267 Illegal mix of collations (utf8_general_ci,IMPLICIT) and (utf8_croatian_ci,IMPLICIT) for operation '='

一般是多表或跨库表查询导致出现的问题,其原因是两张表的字符集不一样导致的,那为什么两张表的字符集会不一样?这是由于架构师或者开发人员在建表的时候不小心选错字符集的原因导致的. 那好我们把两张表(或两个库的关联的两张表)的字符集更改为一样就可以了,是的我们改过来发,发现变态的MYSQL还是一样的错误!!! 我在网上查了一些资料说的感觉很全,但太理论化且不实用(就是解决不了问题). 根据上面的分析我们想两张表的字符集改为一样为目的肯定是可以的,然后我在想是不是字段也存在字符集的概念,但是可恶的是工具

mysql 存储过程中报Illegal mix of collations

我写了一个存储过程,里边有一个游标,然后遍历游标,根据遍历的结果update 另外一张表的值,这是大体情况: 问题是在update的时候报:Illegal mix of collations (utf8_unicode_ci,IMPLICIT) and (utf8_general_ci,IMPLICIT)错误. 表和字段的collate都是utf8_unicode_ci,但是server的是utf8_general_ci,还不能改! 没办法只能在存储过程中转换! 解决方法:将比较等式一边进行字符