【MySQL】Incorrect string value 问题一则

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 【问题现象】凌晨一个客户实例报警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也是一样。要想使用一个东西,必须了解其内部实现的原理。盲目贪图方便,产生了问题就束手无策了。

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
8月前
|
SQL 搜索推荐 关系型数据库
Mysql报Cause: java.sql.SQLException: Incorrect string value: ‘\xE5\xA4\x96‘...for column username
Mysql报Cause: java.sql.SQLException: Incorrect string value: ‘\xE5\xA4\x96‘...for column username
59 0
|
SQL 关系型数据库 PostgreSQL
PostgreSQL中E‘string‘ 的使用
在PostgreSQL中,E'string' 是一种特殊的字符串表示方式,其中的E代表"ESCAPE STRING",即转义字符串。 使用E表示法时,可以在字符串中使用转义字符来表示特殊字符,如换行符(\n),制表符(\t),反斜杠(\\),等等。这种语法可以帮助我们表示那些在普通字符串中可能会引起语法错误或不易识别的特殊字符。 下面是一些使用E'string'的示例及其使用场景: 1. 转义特殊字符:字符串中包含双引号和单引号。 ```sql SELECT E'"Hello" said the \'world\''; ``` 输出结果: "Hello" said the 'world'
360 0
|
XML 关系型数据库 MySQL
已解决Failed to connect mysql database,please check username and password,or mysql is version8? true
已解决Failed to connect mysql database,please check username and password,or mysql is version8? true
354 0
|
SQL 关系型数据库 MySQL
【问题解决】MySQL5.5 向MySQL数据库中插入汉字时,提示:Incorrect string value: '\Xe7\x8E...' for column 'XXX' at row 1
【问题解决】MySQL5.5 向MySQL数据库中插入汉字时,提示:Incorrect string value: '\Xe7\x8E...' for column 'XXX' at row 1
145 0
|
SQL 存储 安全
MySQL的mysql_real_escape_string()函数是干什么的?底层原理是什么?
MySQL的mysql_real_escape_string()函数是干什么的?底层原理是什么?
766 0
|
关系型数据库 MySQL 数据安全/隐私保护
【Mysql】 解决MySQL8.0报错:Unknown system variable ‘validate_password_policy‘
【Mysql】 解决MySQL8.0报错:Unknown system variable ‘validate_password_policy‘
2841 0
【Mysql】 解决MySQL8.0报错:Unknown system variable ‘validate_password_policy‘
|
编解码 关系型数据库 MySQL
python2.7传数据到数据库OperationalError: (1366, "Incorrect string value")
python2.7传数据到数据库OperationalError: (1366, "Incorrect string value")
138 0
|
SQL PHP 数据库
PHP error:mysql_fetch_row() expects parameter 1 to be resource, boolean given 的错误
PHP error:mysql_fetch_row() expects parameter 1 to be resource, boolean given 的错误
167 0
|
关系型数据库 MySQL 数据库
Incorrect string value: '...' for column 'course' at row 1MySQL插入中文错误:
Incorrect string value: '...' for column 'course' at row 1MySQL插入中文错误:
117 0
Incorrect string value: '...' for column 'course' at row 1MySQL插入中文错误:
|
关系型数据库 MySQL
【Mysql】报#1166 - Incorrect column name 'UId '
【Mysql】报#1166 - Incorrect column name 'UId '
142 0