Slave SQL: Error 'Incorrect string value ... Error_code: 1366

背景:

主从环境一样,字符集是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: ‘jute‘. Query: ‘INSERT INTO jute_file_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 jute_file_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 jute_file_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                        | ????                  |
+---------------------------------+-------------------------------------+-------------------+

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

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

在主上的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 `jute`/*!*/;
SET TIMESTAMP=1433927170/*!*/;
INSERT INTO jute_file_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。但是数据库默认的字符集我是设置成utf8的。虽然数据库级别的字符集是utf8,但是程序连主库是使用gbk的,所以主的写入是没有问题的。但是从库的SQL线程会使用默认的字符集,即数据库默认字符集utf8。最终问题定位到:

在主上使用GBK编码写入,在从上使用UTF8编码写入。

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

解决:

把没有写入的数据补到从上去,并且把从的数据库默认字符集改成gbk,重启。

相关文章

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

Slave SQL: Error 'Incorrect string value ... Error_code: 1366

时间: 2024-08-04 15:06:40

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

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]; uncategorized SQLException for SQL [insert into product (pname, market_price, shop_price, image, pdesc, is_hot, pdate, csid) values (?, ?, ?, ?, ?, ?, ?, ?)

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 - Extracted SQL state class 'HY' from value 'HY000' 12:59:10.000 [http-nio-8080-exec-40] DEBUG org.mybatis.spring.SqlSessionUtils - Closing non transactional Sq

jeesite导入数据库错误:java.sql.SQLException: Incorrect string value: '\xE4\xB8\xAD\xE5\x9B\xBD' for column 'name' at row 1问题解决

如果使用mvn antrun:run -Pinit-db进行数据库导入导致出现如下错误: 解决方法: 这个是由于新建数据库没有选择默认字符集导致的,只要选择utf-8即可. jeesite导入数据库错误:java.sql.SQLException: Incorrect string value: '\xE4\xB8\xAD\xE5\x9B\xBD' for column 'name' at row 1问题解决

MySql中报错:java.sql.SQLException: Incorrect string value: '\xF0\x9F\x90\xBB' for column

问题描述: java.sql.SQLException: Incorrect string value: '\xF0\x9F\x90\xBB' for column 'nickName' at row 1 at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1094) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4226) at com.mysql.jdbc.M

解决java.sql.SQLException: Incorrect string value: '\xE6\x88\x91\xE7\x9A\x84...' for column 'groupName'

今天使用mysql,用java程序往mysql中写数据,出现如下错误: Caused by: java.sql.SQLException: Incorrect string value: '\xD3\xCD\xBB\xAD' for column 'type' at row 1 解法: 创建每张表的时候都必须设置数据编码方式: drop table if exists we_artwork_desc; CREATE TABLE we_artwork_desc ( id VARCHAR(200),

java.sql.SQLException: Incorrect string value: '\xF0\x9F\x98\x87<b

实际开发中遇到的 情景: 解决方案:  复制的别人的博客,没测试, Incorrect string value: '\xF0\x9F...' for column 'XXX' at row 1 这个问题,原因是UTF-8编码有可能是两个.三个.四个字节.Emoji表情或者某些特殊字符是4个字节,而MySQL的utf8编码最多3个字节,所以数据插不进去. 我的解决方案是这样的 1.在mysql的安装目录下找到my.ini,作如下修改: [mysqld] character-set-server=

微信表情过滤 java "java.sql.SQLException: Incorrect string value: '\"

iOS 5.0之前,苹果都是采用3个字节来承接emoji表情,Java的普通char可以支持显示.但iOS 5.0之后, 苹果升级了系统自带的emoji表情输入法,用的Unicode 6标准来统一,是采用4个bytes来承接一个 emoji表情.如果不做处理的话,这种表情直接存储到mysql5.5以下的数据库是会报错的. 就像这两个表情一样:, 在Windows 8以下估计都不支持显示,可能会显示成框框,可能压根就是空白, 你可以在Mac中使用Safari浏览器中,就可以看到.经过测试,在Mac

mysql 保存emoji时报,数据库报错:Caused by: java.sql.SQLException: Incorrect string value: '\xF0\x9F\x98\x82\xF0\x9F...' for column 'review' at row 1

错误原因:我们可以看到错误提示中的字符0xF0 0x9F 0x98 0x84 ,这对应UTF-8编码格式中的4字节编码(UTF-8编码规范).正常的汉字一般不会超过3个字节,为什么为出现4个字节呢?实际上是它对应的是智能手机输入法中的表情.那为什么会报错呢?因为mysql中的utf-8并不是真正意义上的utf-8,它只能存储1~3个字节长度的utf-8编码,如果想存储4个字节的必须用utf8mb4类型.不而要使用utf8mb4类型,首先要保证Mysql版本要不低于 MySQL 5.5.3. 常用

java.sql.SQLException: Incorrect string value: '\xC3\x8E\xC2\xA2\xC3\x88...'

MYSQL插入数据的时候,出现了下面的错误: java.sql.SQLException: Incorrect string value: '\xC3\x8E\xC2\xA2\xC3\x88...' for column 'details' at row 1 at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:946) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java