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)

转载于:https://www.cnblogs.com/jackhub/p/3909539.html

MySQL replication illegal mix of collations相关推荐

  1. MySQL:Illegal mix of collations (utf8_general_ci,COERCIBLE) and (gbk_chinese_ci,IMPLICIT) for operat

    MySQL:Illegal mix of collations (utf8_general_ci,COERCIBLE) and (gbk_chinese_ci,IMPLICIT) for operat ...

  2. MySQL错误illegal mix of collations (utf8_unicode_ci,IMPLICIT) and (utf8_general_ci,IMPLICIT)解决方法

    (1)该错误一般出现在多表连接的SQL语句中,主要是两个表的编码字符集不一致所致: 此时需要将两个表的字符集修改成一致的,即两个表的字符集都为同一个都为utf8_unicode_ci或者都为utf8_ ...

  3. mysql Illegal mix of collations (utf8_general_ci,IMPLICIT) and (utf8mb4_general_ci,COERCIBLE) fo...

    错误:"Illegal mix of collations (utf8_general_ci,IMPLICIT) and (utf8mb4_general_ci,COERCIBLE) for ...

  4. Illegal mix of collations (XXX) and (XXX) for operation ‘XXX’

    问题描述: mybatis使用INSTR的时候报错(数据库为MySQL)-- Illegal mix of collations (XXX) and (XXX) for operation 'XXX' ...

  5. mysql illegal mix of_mysql提示:Illegal mix of collations for operation ‘UNION’

    语句很简单 代码如下 ?php $connection=mysql_connect(localhost,root,password); //连接并选择数据库服务器 mysql_select_db(te ...

  6. mysql general error,mysql General error: 1267 Illegal mix of collations错误​

    在项目迁移之后一个视图的访问出现了问题,报了mysql的1267错误,具体报错信息就是 SQLSTATE[HY000]: General error: 1267 Illegal mix of coll ...

  7. Illegal mix of collations (utf8_unicode_ci,IMPLICIT) and (utf8_general_ci,IMPLICIT) for operation '=

    问题描述:MySQL进行字符串比较时发生错误: SELECT a.equ_no, b.fullCode FROM equipment a, ( SELECT t.*, getEquTypeFullCo ...

  8. 【Java】application run failed Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and

    springboot 启动时报这个错:application run failed Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and ...

  9. 调用存储过程时报错:Illegal mix of collations

    调用存储过程时,发生报错,信息如下: ERROR 1267 (HY000): Illegal mix of collations (gb2312_chinese_ci,IMPLICIT) and (l ...

最新文章

  1. 用C语言扩展PHP功能
  2. linux message日志只有4k,命令长期运行 常用技巧 Linux 服务器 · 404k的前后端日志...
  3. opencv 全志_移植opencv人脸识别到全志A10开发板上 +linux3.0内核
  4. 用keil4 模拟仿真显示引脚波形输出分析的步骤
  5. 安卓虚拟机与Hyper-V冲突
  6. linux 双mipi摄像头,VS-RK3399 在linux系统下面调试Mipi camera接口介绍
  7. hashmap另一种初始化
  8. js与c语言互相调用,Objc与JS间相互调用
  9. 孤岛惊魂5服务器稳定吗,这才是《孤岛惊魂5》真正的“最低画质”
  10. 真快!iOS 15.4支持戴口罩解锁了:苹果终于满足iPhone用户需求
  11. C#结合VS开发WinForm学习笔记
  12. c#窗体程序 内嵌浏览器
  13. 新能源汽车动力电池(热管理)热流体仿真分析-基于SCDM和STAR-CCM+热仿真分析课程(评论发链接)
  14. CSS 长度单位详细总结
  15. 软件测试 实验一 软件测试案例分析
  16. YOLO图像快速标注工具
  17. Vue-change和input事件
  18. ABC一体机plus版横空出世,此时的你看得懂“浪潮牌”AI吗?
  19. 洲际酒店品牌中国西北地区首家酒店在西安开业
  20. 红外线便携式人体测温仪方案产品说明

热门文章

  1. vb雅西高速计算机考试,雅西高速沿途风貌车拍八
  2. 菁英班OJ赛2022-2-24(第一周)
  3. eviews 9.5新版本——平均预测、面板效应检验
  4. qt界面布局之使窗口显示出现在正中间位置
  5. 搭建 sock5代理服务器
  6. Caused by: java.lang.ClassNotFoundException: javax.persistence.NamedStoredProcedureQuery
  7. 如何用开源经历为你的简历增加光彩
  8. java假设模拟请求重新启动路由器(网络爬虫经常使用),还有java怎样下载图片
  9. 路由映射-route-map之一路由再发布
  10. 本训练中心主任致互联网技术学员