mysql number类型引号问题

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
云数据库 RDS MySQL Serverless,价值2615元额度,1个月
简介:

背景

 这几天在做数据自动化同步测试过程,发现一个诡异的现象。一批100条语句的更新过程中,同步到目标库去执行,总会有几条记录出现更新失败。

原因

1. 查看了同步过程中的执行日志,也米有啥特别明显的问题,单就是update affect = 0 。

2. 问题的查找方式也是比较简单,针对底层执行的update语句,挨个字段确认,到底是哪一个字段影响了记录的定位。 最后发现是一个Decimal(19,8)的字段类型。

3. debug跟踪了下对应的mysql driver代码,发现针对setBigDecimal类型数据处理时,多了个单引号,字段内容就变成了 '1234.12312'.  测试过程中手工去除引号,就可以正常的update. 

 

测试

1.1.创建表  
2.mysql> create table ljhtable2 ( ID int(11) auto_increment , NUMBER_VALUES decimal(19,8) , CONSTRAINT ljhtable2_pk PRIMARY KEY(id) );  
3.  
4.2. 插入记录  
5.mysql> insert into ljhtable2 values(1, 4005747665.56665202);  

查询


1.mysql> select * from ljhtable2 ;  
2.+----+---------------------+  
3.| ID | NUMBER_VALUES       |  
4.+----+---------------------+  
5.|  1 | 4005747665.56665202 |  
6.+----+---------------------+  
7.1 row in set (0.00 sec)  
8.  
9.mysql> select * from ljhtable2 where number_values = '4005747665.56665202'; #加了引号就无法查询到  
10.Empty set (0.00 sec)  
11.  
12.mysql> select * from ljhtable2 where number_values = 4005747665.56665202;  
13.+----+---------------------+  
14.| ID | NUMBER_VALUES       |  
15.+----+---------------------+  
16.|  1 | 4005747665.56665202 |  
17.+----+---------------------+  
18.1 row in set (0.00 sec)  

深度分析

1. 资讯了下公司的资深的mysql DBA,针对加引号的处理,目前mysql的版本存在一些bug,我们使用的mysql 版本(5.1.41),所以只能通过mysql driver层面进行修复。 

2. mysql driver我们使用了server-side preparestatment + batch处理,问题就出在这里 (参数介绍: mysql几个参数(编码,预编译,批处理) )

 

这是我们使用的mysql driver参数


1.dbcpDs.addConnectionProperty("useServerPrepStmts", "true");  
2.dbcpDs.addConnectionProperty("rewriteBatchedStatements", "true");  

对应server-side的prepare实现类:ServerPreparedStatement .  

通过debug分析,在ServerPreparedStatement.toString()过程中针对Decimal类型,添加了引号,在跟踪了execute发送给mysql的数据包都是使用了writeLenString进行处理,不过看了下针对int,long,float类型也没有明确的类型标识,估计是在mysql server端进行类型转换处理,刚好类型转换又有些bug,就触发了上面的问题。

 

发送数据包的格式代码:ServerPreparedStatement.storeBinding()

解决

去掉上面的两项配置定义,使用mysql的client-side模式进行处理,由客户端拼装好sql,直接到mysql上进行执行。针对client-side的batch的一些优化处理,可以参见PreparedStatement.executePreparedBatchAsMultiStatement方法

考虑

目前mysql driver默认的都是基于client-side模式进行处理,可参见mysql driver changelog: http://dev.mysql.com/doc/refman/5.1/en/cj-news-5-0-5.html 

5.0.5的版本里提到


1.Due to a number of issues with the use of server-side prepared statements, Connector/J 5.0.5 has disabled their use by default. The disabling of server-side prepared statements does not affect the operation of the connector in any way  

client-side和server-side的性能差别:

1. server-side需要和服务端的2次网络交互,一次进行prepare statement的构建过程,一次发送具体的bind数据。服务端可以缓存对应的prepare statement内容

2. client-side只需要一次和服务端的网络交互,但每次的sql都需要在服务端进行parse

 

所以针对server-side模式,如果不在jdbc客户端层面开启prepare statement cache,性能还不如client-side模式。而dbcp开启prepare statement cache,可能又会引发另外的问题: statement异常关闭。 在之前的dbcp测试过程中遇到过,后来就关闭了dbcp的prepare statement cache. 


相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
2月前
|
关系型数据库 MySQL
Mysql基础第十九天,使用不同类型的链接
Mysql基础第十九天,使用不同类型的链接
25 0
Mysql基础第十九天,使用不同类型的链接
|
4天前
|
存储 关系型数据库 MySQL
9.2.5.2 【MySQL】XDES 类型
9.2.5.2 【MySQL】XDES 类型
9 0
9.2.5.2 【MySQL】XDES 类型
|
5天前
|
存储 关系型数据库 MySQL
MySQL字段的字符类型该如何选择?千万数据下varchar和char性能竟然相差30%🚀
本篇文章来讨论MySQL字段的字符类型选择并深入实践char与varchar类型的区别以及在千万数据下的性能测试
MySQL字段的字符类型该如何选择?千万数据下varchar和char性能竟然相差30%🚀
|
11天前
|
SQL DataWorks 关系型数据库
DataWorks操作报错合集之DataWorks在同步mysql时报错Code:[Framework-02],mysql里面有个json类型字段,是什么原因导致的
DataWorks是阿里云提供的一站式大数据开发与治理平台,支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
30 0
|
11天前
|
关系型数据库 MySQL Java
Java时间转换为MySQL中的INT类型时间戳
Java时间转换为MySQL中的INT类型时间戳
|
2月前
|
弹性计算 安全 关系型数据库
rds网络类型选取
云数据库RDS的网络类型选择包括经典网络、专有网络(VPC)、公共网络和私有网络。推荐使用VPC以实现高安全隔离,私有网络增加安全性且节省公网费用。根据业务需求和安全策略选择,如需内部访问选择同一VPC,外部访问则需公网并配以严格安全措施。最新阿里云RDS建议使用VPC并结合安全组、网络ACL和白名单保障安全,通过CEN实现跨地域通信。
17 7
|
2月前
|
存储
TS 自定义结构Long与number类型相互转换
TS 自定义结构Long与number类型相互转换
|
2月前
|
存储 关系型数据库 MySQL
MySQL中常见的存储引擎类型
【2月更文挑战第18天】
63 7
|
1天前
|
关系型数据库 MySQL 数据库
docker MySQL删除数据库时的错误(errno: 39)
docker MySQL删除数据库时的错误(errno: 39)
|
1天前
|
关系型数据库 MySQL 数据库连接
用Navicat备份Mysql演示系统数据库的时候出:Too Many Connections
用Navicat备份Mysql演示系统数据库的时候出:Too Many Connections