【MySQL】Incorrect string value 问题一则

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 【问题现象】凌晨一个客户实例报警slave sql 进程由于报如下错误而停止:mysql> show slave status \G*************************** 1.
【问题现象】
凌晨一个客户实例报警slave sql 进程由于报如下错误而停止:
mysql> show slave status \G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                 .....
                 ......
               Last_SQL_Errno: 1366
               Last_SQL_Error: Error 'Incorrect string value: '\xD0\xC2\xBD\xA8\xB2\xE2...' for column 'name' at row 1' on query. Default database: 'rds'. Query: 'insert into task (Name, taskid, changeid, creator, memberIds, workType, workload, projectId, startDatePlanned, endDatePlanned, chgdate, chgreason) values (0xD0C2BDA8B2E2CAD4D3C3C0FDD7D6B6CEB8C4D4EC, 3519, NULL, 973, 0x36, NULL, 24, 45, '2013-09-06 00:00:00', '2013-09-11 00:00:00', '2013-09-06 16:36:07', "")'
  Replicate_Ignore_Server_Ids: 
             Master_Server_Id: 3963011170
1 row in set (0.00 sec)
报错提示:插入的字段格式和数据库表定义的格式不一样,insert的值是十六进制而表结构定义中 name  是varchar 。

查看表结构:
mysql> show create table task \G
*************************** 1. row ***************************
       Table: task
Create Table: CREATE TABLE `task` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  ` name ` varchar(100) NOT NULL DEFAULT '',
  `description` text,
   .....
) ENGINE=InnoDB AUTO_INCREMENT=3521 DEFAULT CHARSET=gbk

导致slave停止的原因是有一些眉目了,如何解决这个字段类型不一致的问题?
【分析】
查看了java代码之后发现java类型传错 传入的值ids 是string类型,
public int insertPointRecord(String name) throws DAOException {
    if (null == name)
        throw new DAOException("name is null");
    
    String name[] = StringUtils.split(name, ",");
    for (int i = 0; i
        Map parameterObject = new HashMap();
        parameterObject.put("name", name[i]);
        this.executeInsert("PointRecordDAO.insertPointRecord", parameterObject, DBRouteFactory.getIDDBRoute(Long.valueOf(name[i])));
    }
    return name.length;
}
ibatis会不断发出类似于select * from test limit 0 的sql去获取表结构的元数据,并缓存在客户端。
如果传入ibatis的字段内容和ibatis自动获取的元数据不匹配,ibatis会自作主张地将数据变为十六进制,拼接成SQL之后发给MySQL执行。
十六进制的SQL在大多数情况下不会走索引,对于大量dml操作,传递到备库,备库和主库之间的延迟越来越大。
【解决方法】
1 修改代码修改name的初始化数据类型:
新的代码将parameterObject.put("name", name[i]);改为parameterObject.put("name", new char(name[i]));
2 修改表结构的数据类型
alter table task modify `name` mediumtext  character set gbk;
注意字符集设置。
总结:
不仅仅是开发人员,对于DBA也是一样。要想使用一个东西,必须了解其内部实现的原理。盲目贪图方便,产生了问题就束手无策了。

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
目录
相关文章
Foo
|
存储 Prometheus 监控
拥抱开源生态:阿里云InfluxDB集成Prometheus查询
前言 Prometheus是CNCF的毕业项目,其生态已成为云原生监控领域的事实标准。Kubernetes集群的指标通过Prometheus格式暴露,很多新项目也直接选择Prometheus格式暴露指标数据,传统应用(比如MySQL, MongoDB,Redis等)在开源社区都有Prometheus Exporter来接入Prometheus生态。 Prometheus内置的tsdb适合存储短
Foo
2455 0
拥抱开源生态:阿里云InfluxDB集成Prometheus查询
|
监控 Java
【Java】已解决:Java.lang.OutOfMemoryError: GC overhead limit exceeded
【Java】已解决:Java.lang.OutOfMemoryError: GC overhead limit exceeded
2924 0
|
9月前
|
人工智能 Cloud Native 关系型数据库
双位数增长,阿里云连续五年领跑关系型数据库
阿里云蝉联中国关系型数据库整体市场份额第一,在公有云业务双位数增长的驱动下,阿里云同时在公有云关系型数据库市场取得了38%的市场份额,连续五年位居首位。
|
人工智能 分布式计算 BI
妙用OSGraph:发掘GitHub知识图谱上的开源故事
OSGraph (Open Source Graph) 是一个开源图谱关系洞察工具,基于GitHub开源数据全域图谱,实现开发者行为、项目社区生态的分析洞察。可以为开发者、项目Owner、开源布道师、社区运营等提供简洁直观的开源数据视图,帮助你和你的项目制作专属的开源名片、寻求契合的开发伙伴、挖掘深度的社区价值。
妙用OSGraph:发掘GitHub知识图谱上的开源故事
|
运维 安全 网络安全
带你读《网络安全等级保护2.0定级测评实施与运维》——2.2 网络安全标准体系
带你读《网络安全等级保护2.0定级测评实施与运维》——2.2 网络安全标准体系
带你读《网络安全等级保护2.0定级测评实施与运维》——2.2  网络安全标准体系
|
消息中间件 数据库
RabbitMQ保证消息的一致性解决方案RabbitMQ保证消息的一致性解决方案
RabbitMQ保证消息的一致性解决方案RabbitMQ保证消息的一致性解决方案
Qt实现在表格中添加气泡显示功能
Qt实现在表格中添加气泡显示功能
369 0
|
并行计算 算法 搜索推荐
【密码学】 对称加密算法
在密码学中,加密算法按照实现方式可分为对称加密算法和非对称加密算法。对称加密算法指的是加密方和解密方使用相同的密钥进行加密和解密,即双方使用共同的密钥。在对称加密算法使用的过程中,数据发送方将明文数据通过密钥进行加密生成密文数据,将密文数据发送给接收方,接收方收到密文数据后,通过密钥进行解密,将其恢复成明文数据。这就要求接收方要首先知道密钥,这需要发送方先将密钥通过安全方式发给接收方,通常会使用非对称加密例如ECDH算法来传输密钥(非对称密钥会在下章讲解)。
753 0
【密码学】 对称加密算法
idea文件夹目录结构变成一行怎么办
idea文件夹目录结构变成一行怎么办
835 0
idea文件夹目录结构变成一行怎么办
|
存储 缓存 ARouter
Android开源系列-组件化框架Arouter-(二)深度原理解析
最近组里需要进行**组件化框架**的改造,用到了**ARouter**这个开源框架,为了更好的对项目进行改造,笔者花了一些时间去了解了下ARouter