背景:

主从环境一样,字符集是utf8。

Slave复制报错,平时复制都正常也没有出现过问题,今天突然报错:

150610 17:47:10 [ERROR] Slave SQL: Error 'Incorrect string value: '\xD3\xC3\xB6\xD2\xBB\xBB...' for column 'remark' at row 1' on query. Default database: 'jj'. Query: 'INSERT INTO user_book(appType,bookId,createTime,deviceType,id,modifyTime,money,remark,status,userId) VALUES (1,8004453,'2015-06-10 17:06:10',0,0,'2015-06-10 17:06:10',600,0xCAB9D3C3B6D2BBBBC2EB20454E4547435056505452555020B9BAC2F2,1,4669278)', Error_code: 1366
150610 17:47:10 [Warning] Slave: Incorrect string value: '\xD3\xC3\xB6\xD2\xBB\xBB...' for column 'remark' at row 1 Error_code: 1366
150610 17:47:10 [ERROR] Error running query, slave SQL thread aborted. Fix the problem, and restart the slave SQL thread with "SLAVE START". We stopped at log 'mysql-bin-3306.003582' position 207897687

perror 1366

MySQL error code 1366 (ER_TRUNCATED_WRONG_VALUE_FOR_FIELD): Incorrect %-.32s value: '%-.128s' for column '%.192s' at row %ld

从上面2个信息得到从库复制失败的原因是因为字符集的问题引起的。

分析:

在Master上查询该条记录,看看是否正常:

>select remark from user_book where appType=1 and bookId=8004453 and createTime='2015-06-10 17:06:10';
+-------------------------------------+
| remark |
+-------------------------------------+
| 使用兑换码 ENEGCPVPTRUP 购买 |
+-------------------------------------+

在主上写入正常,但在从上写入就报错了,为什么?

 [Warning] Slave: Incorrect string value: '\xD3\xC3\xB6\xD2\xBB\xBB...' for column 'remark' at row 1 Error_code: 1366

在错误日志里面看到从上对应插入的语句是:

INSERT INTO user_book(appType,bookId,createTime,deviceType,id,modifyTime,money,remark,status,userId) VALUES (1,8004453,'2015-06-10 17:06:10',0,0,'2015-06-10 17:06:10',600,0xCAB9D3C3B6D2BBBBC2EB20454E4547435056505452555020B9BAC2F2,1,4669278)

这里的"0xCAB9D3C3B6D2BBBBC2EB20454E4547435056505452555020B9BAC2F2"代表什么意思呢?因为在主上看到的值是"使用兑换码 ENEGCPVPTRUP 购买"。那么看下他的16进制数是多少:

主:
>select hex('使用兑换码'),hex('ENEGCPVPTRUP'),hex('购买'),hex('使用兑换码 ENEGCPVPTRUP 购买')
-> ;
+--------------------------------+--------------------------+---------------+------------------------------------------------------------------------+
| hex('使用兑换码') | hex('ENEGCPVPTRUP') | hex('购买') | hex('使用兑换码 ENEGCPVPTRUP 购买') |
+--------------------------------+--------------------------+---------------+------------------------------------------------------------------------+
| E4BDBFE794A8E58591E68DA2E7A081 | 454E45474350565054525550 | E8B4ADE4B9B0 | E4BDBFE794A8E58591E68DA2E7A08120454E4547435056505452555020E8B4ADE4B9B0 |
+--------------------------------+--------------------------+---------------+------------------------------------------------------------------------+

看到主上的值转换出来之后和从上的不一致,这个就是这次问题的所在,那么通过unhex来看看从上的到底是什么导致插入错误的。

主:E4BDBFE794A8E58591E68DA2E7A08120 454E4547435056505452555020 E8B4ADE4B9B0
从:CAB9D3C3B6D2BBBBC2EB20 454E4547435056505452555020 B9BAC2F2

上面看到对于英文是没有问题的,字符集问题主要出在汉字上面。通过unhex查看:

主:
>select unhex('E4BDBFE794A8E58591E68DA2E7A08120'),unhex('454E4547435056505452555020'),unhex('E8B4ADE4B9B0');
+-------------------------------------------+-------------------------------------+-----------------------+
| unhex('E4BDBFE794A8E58591E68DA2E7A08120') | unhex('454E4547435056505452555020') | unhex('E8B4ADE4B9B0') |
+-------------------------------------------+-------------------------------------+-----------------------+
| 使用兑换码 | ENEGCPVPTRUP | 购买 |
+-------------------------------------------+-------------------------------------+-----------------------+ 从:
>select unhex('CAB9D3C3B6D2BBBBC2EB20'),unhex('454E4547435056505452555020'),unhex('B9BAC2F2');
+---------------------------------+-------------------------------------+-------------------+
| unhex('CAB9D3C3B6D2BBBBC2EB20') | unhex('454E4547435056505452555020') | unhex('B9BAC2F2') |
+---------------------------------+-------------------------------------+-------------------+
| ʹ?öһ??? | ENEGCPVPTRUP | ???? |
+---------------------------------+-------------------------------------+-------------------+

上面得出的结果是确实存在乱码导致插入异常。理论上来说主上执行什么,从上就应该执行什么,不会出现问题,那这次错误是怎么回事?

主从上表结构都是一样的,主从表的remark字段的字符集是utf8,并且从在MySQL客户端上也可以正常插入中文,为什么通过复制存就出问题了?所以乱码和表字符集没有关系。如果是程序问题,那主从应该都会出错。所以和程序也没有关系,那到底和什么有关系?

在主上的binlog查看那条插入语句:

/*!\C gbk *//*!*/;
SET @@session.character_set_client=28,@@session.collation_connection=28,@@session.collation_server=33/*!*/;
SET @@session.lc_time_names=0/*!*/;
SET @@session.collation_database=DEFAULT/*!*/;
BEGIN
/*!*/;
# at 207897755
#150610 17:06:10 server id 3 end_log_pos 207897783 Intvar
SET INSERT_ID=47282/*!*/;
# at 207897783
#150610 17:06:10 server id 3 end_log_pos 207898096 Query thread_id=3945271 exec_time=0 error_code=0
use `jj`/*!*/;
SET TIMESTAMP=1433927170/*!*/;
INSERT INTO user_book(appType,bookId,createTime,deviceType,id,modifyTime,money,remark,status,userId) VALUES (1,8004453,'2015-06-10 17:06:10',0,0,'2015-06-10 17:06:10',600,0xCAB9D3C3B6D2BBBBC2EB20454E4547435056505452555020B9BAC2F2,1,4669278)
/*!*/;

这里需要注意:在上面红色加粗的地方看到插入的时候默认字符集是gbk,而整个数据库的字符集也是gbk,程序客户端写入也是gbk。但是数据表的remark字段的字符集是utf8的。在主的写入时,utf8可以包含gbk的编码,进行内部转换,所以主写入是没有问题的。但是从库的SQL线程在执行时候就报错,说明问题可以定位到从库在执行的时候报错。

说到这里,有个问题是为什么binlog记录的是十六进制,而不是正常的?问题就出在这里,具体的分析见:http://backend.blog.163.com/blog/static/20229412620133274030845/

那为什么之前复制没有问题,而现在复制出现了问题。原因是之前这个字段的写入都是非中文的字符串,现在有中文写入,错误就来了。

解决:

把没有写入的数据补到从上去,并且把主从数据库表的remark字段都设置成gbk,问题解决。另一个方法就是把binlog format设置成Row。

总结:

上面的问题说明,对MySQL进行操作的时候一定要注意字符集编码的问题,最好让客户端、服务端、表、字段的字符集保持一致。不一致导致的乱码问题是比较常见的一种错误。

相关文章

http://blog.csdn.net/lwei_998/article/details/41346655

http://www.cnblogs.com/zhoujinyi/archive/2012/11/01/2748313.html

Slave SQL: Error 'Incorrect string value ... Error_code: 1366的更多相关文章

  1. nested exception is java.sql.SQLException: Incorrect string value: '\xE7\x99\xBB\xE9\x99\x86...' for column 'image' at row 1

    HTTP Status 500 - Hibernate operation: could not insert: [cn.itcast.shop.product.vo.Product]; uncate ...

  2. java.sql.SQLException: Incorrect string value: '\xF0\x9F\x98\xB3' for column 'Content' at row 1

    在尝试将 emoji 表情符号 插入MySQL数据库时,遇到以下错误信息: ### The error occurred while setting parameters ### SQL: INSER ...

  3. java.sql.SQLException: Incorrect string value: '\xF0\x9F\x9A\x80\xF0\x9F...' for column 'name' at row 1

    1.异常提示: 12:59:10.000 [http-nio-8080-exec-40] DEBUG o.s.j.s.SQLStateSQLExceptionTranslator - Extracte ...

  4. MySql系列:中文写入数据库出现错误java.sql.SQLException: Incorrect string value: '\xE5\xxxx' for column 'xxxx' at row 1及其解决方法

    在将kft-activiti-demo的数据库连接改为mysql之后,可以正常登陆,但是在新建请假流程的时候出现如下错误:   Caused by: java.sql.SQLException: In ...

  5. MySQL添加中文字符集问题 --- java.sql.SQLException: Incorrect string value

    今天在做开关记录的时候,数据库表中description字段用于记录当前版本的描述(需要存储中文),在测试程序的时候发现如果用户输入中文,那么后台会报错.错误信息如下: java.sql.SQLExc ...

  6. mysql报错:java.sql.SQLException: Incorrect string value: '\xE4\xB8\x80\xE6\xAC\xA1...' for column 'excelName' at row 1

    一.问题 用Eclipse做项目时候报错 java.sql.SQLException: Incorrect string value: '\xE4\xB8\x80\xE6\xAC\xA1...' fo ...

  7. 表情存储异常--mybatis抛出异常(java.sql.SQLException: Incorrect string value: '\xF0\x9F\x92\x94' for column 'name' at row 1)

    文章参考 https://blog.csdn.net/junsure2012/article/details/42171035 https://www.cnblogs.com/WangYunShuai ...

  8. java.sql.SQLException: Incorrect string value: '\xE5\xB0‘

    mysql插入中文字符报java.sql.SQLException: Incorrect string value: '\xE5\xB0‘ #原因:由于默认情况下,mysql的字符集是latin1(I ...

  9. java.sql.SQLException: Incorrect string value: '\xF0\x9F\x98\x8E' for column 'nick' at row 1

    java.sql.SQLException: Incorrect string value: '\xF0\x9F\x98\x8E' for column 'nick' at row 1 mysql报错 ...

随机推荐

  1. vim的寄存器和剪贴簿操作?

    vim 复制/ 删除 多行? 有确定序号的行: :10,15m20, 10,15co20 没有确定序号的行: ndd, nyy. 其中的n表示, 从当前行开始算起(当前行本身要包含!!!), 向下共删 ...

  2. Supervisor 安装与配置

    Supervisor是一个进程监控程序. 满足的需求是:我现在有一个进程需要每时每刻不断的跑,但是这个进程又有可能由于各种原因有可能中断.当进程中断的时候我希望能自动重新启动它,此时,我就需要使用到了 ...

  3. 密码学初级教程(八)SSL/TLS-为了更安全的通信

    SSL/TLS是世界上应用最广泛的密码通信方法.用到对称密码.消息认证码.公钥密码.数字签名.伪随机数生成器等密码技术. 密码套件 SSL/TLS提供了一种密码通信的框架,SSL/TLS中使用的对称密 ...

  4. [译]Mongoose指南 - 中间件

    中间件是一些函数, 当document发生init, validate, save和remove方法的时候中间件发生. 中间件都是document级别的不是model级别的. 下面讲讲两种中间件pre ...

  5. HDOJ 1520 Anniversary party

    树形DP....在树上做DP....不应该是猴子干的事吗?  Anniversary party Time Limit: 2000/1000 MS (Java/Others)    Memory Li ...

  6. vc++6.0各种报错合集(附:VC++6.0调出打印窗口的方法)

    背景: 由于VC++6.0对于现在的我来说,只是一个工具,暂时没有太多的时间分配到这块去深究它,由于不明其原理,因此也只是在此把错误积累下来,以备下次相同错误出现时能快速排除,节省时间. 正文 一.出 ...

  7. 【PHP面向对象(OOP)编程入门教程】18.__call()处理调用错误

    在程序开发中,如果在使用对象调用对象内部方法时候,调用的这个方法不存在那么程序就会出错,然后程序退出不能继续执行.那么可不可以在程序调用对象内部 不存在的方法时,提示我们调用的方法及使用的参数不存在, ...

  8. 将Centos的yum源更换为阿里云源

    阿里云Linux安装软件镜像源 阿里云是最近新出的一个镜像源.得益与阿里云的高速发展,这么大的需求,肯定会推出自己的镜像源.阿里云Linux安装镜像源地址:http://mirrors.aliyun. ...

  9. 用H5的canvas做时钟

    <!doctype html><html> <head> <meta charset="UTF-8"> <title>D ...

  10. 学C++50条建议

    1.把C++当成一门新的语言学习(和C没啥关系!真的.): 2.看<Thinking In C++>,不要看<C++变成死相>: 3.看<The C++ Programm ...