当 SQL Server(mssql-jdbc) 遇上 BigDecimal

这篇具有很好参考价值的文章主要介绍了当 SQL Server(mssql-jdbc) 遇上 BigDecimal。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

需求背景

  系统对接了外部系统,调用外部系统的接口需要付费,一个接口一次调用付费 0.03 元

  同一个月内,同一个接口最高付费 25 元

  统计每个月的付费情况

  需求清楚了不?不清楚? 给大家举个案例

当 SQL Server(mssql-jdbc) 遇上 BigDecimal,服务器,数据库,运维

  这下明白了吧

  明白了需求,相信大家都会觉得很简单,不就是一个分组汇总吗?

  客官说的对,但生活总会给我们一点 surprise 

当 SQL Server(mssql-jdbc) 遇上 BigDecimal,服务器,数据库,运维

  我们慢慢往下看

环境准备

   SQL Server 版本: SQL Server 2017 

   MySQL 版本: 8.0.27 

  引入 MySQL ,是为了跟 SQL Server 做对比

   SQL Server 建表并初始化数据

当 SQL Server(mssql-jdbc) 遇上 BigDecimal,服务器,数据库,运维

 View Code

   MySQL 建表并初始化数据

当 SQL Server(mssql-jdbc) 遇上 BigDecimal,服务器,数据库,运维

 View Code

  汇总每个月的付费, SQL 该如何写?

  很简单的啦,如下所示

当 SQL Server(mssql-jdbc) 遇上 BigDecimal,服务器,数据库,运维

 View Code

当 SQL Server(mssql-jdbc) 遇上 BigDecimal,服务器,数据库,运维

  通用写法, SQL Server 和 MySQL 都支持

  我们看下查询结果

当 SQL Server(mssql-jdbc) 遇上 BigDecimal,服务器,数据库,运维

  一切都很正常,觉得世界真美好!

当 SQL Server(mssql-jdbc) 遇上 BigDecimal,服务器,数据库,运维

问题复现

  我们不能光玩数据库吧?

当 SQL Server(mssql-jdbc) 遇上 BigDecimal,服务器,数据库,运维

  不得像这样雨露均沾?

  必须把 spring-boot 、 MyBatis-Plus 安排上

   mysql-jdbc 版本: 8.0.21 , mssql-jdbc 版本: 6.2.1.jre8 

  完整代码:mybatis-plus-dynamic-datasource

  访问: http://localhost:8081/interface/summary?startMonth=202301&endMonth=202302 

  你会发现,你心心念念的 surprise 终于出现了!

当 SQL Server(mssql-jdbc) 遇上 BigDecimal,服务器,数据库,运维

  正确应该是 86.3.3 哪去了?

当 SQL Server(mssql-jdbc) 遇上 BigDecimal,服务器,数据库,运维

  直查数据库是没问题的呀

当 SQL Server(mssql-jdbc) 遇上 BigDecimal,服务器,数据库,运维

  莫非 MyBatis-Plus 有问题?

  我们切到 MySQL 试试;将 InterfaceCallTimesServiceImpl 上的数据源改成 mysql_db 

当 SQL Server(mssql-jdbc) 遇上 BigDecimal,服务器,数据库,运维

  然后重启,我们再访问: http://localhost:8081/interface/summary?startMonth=202301&endMonth=202302 

当 SQL Server(mssql-jdbc) 遇上 BigDecimal,服务器,数据库,运维

  这说明应该不是 MyBatis 的问题,那不完犊子了?

当 SQL Server(mssql-jdbc) 遇上 BigDecimal,服务器,数据库,运维

问题解决

  是不是束手无策了? 也不是,我们可以 Bing 一下的嘛

  你会发现说的都是批量 insert 的时候, BigDecimal 有精度丢失

  单条插入的时候,是没有精度丢失的

  然后了,大家试出了一条件论: 批量插入数据时,如果插入的数据精度不统一,最终入库的数据精度统一按最低的精度入库 

  虽说我们只是查询,莫非也需要 精度统一 ?

  精度统一

  试试呗,反正又不要钱

当 SQL Server(mssql-jdbc) 遇上 BigDecimal,服务器,数据库,运维

  重启,神奇的事情发生了

当 SQL Server(mssql-jdbc) 遇上 BigDecimal,服务器,数据库,运维

  .3 它回来了! 相信此刻的你肯定有一种与知己久别重逢的激动

  问题貌似解决了,但说实话,这种处理方式你用的放心吗?

  升级 mssql-jdbc 版本

  我们好好捋一下,程序从 SQL Server 获取数据,经历了哪些环节?

  只有三个: MyBatis-Plus  ->  mssql-jdbc ->  SQL Server 

  前面我们已经排除了 SQL Server 和 MyBatis-Plus 

  那问题肯定就出在 mssql-jdbc 身上了

  问题又来了,该如何从 mssql-jdbc 上找问题了?

  开源的东西从它的官方找相关的 issue ,肯定不止我们遇到这样的问题,那么肯定有人会给官方提了 issue 

   issue 地址: https://github.com/microsoft/mssql-jdbc/issues 

  直接搜索 BigDecimal ,像这样

当 SQL Server(mssql-jdbc) 遇上 BigDecimal,服务器,数据库,运维

  回车之后,你会发现,原来你不是一个人在战斗

当 SQL Server(mssql-jdbc) 遇上 BigDecimal,服务器,数据库,运维

  那就去里面找呗,发现 #1489 跟我们的问题有点像,仔细去读,发现关联了 #1912

当 SQL Server(mssql-jdbc) 遇上 BigDecimal,服务器,数据库,运维

  读到 1912 的末尾,你会发现又关联了 #2051,我们去看看 2051

当 SQL Server(mssql-jdbc) 遇上 BigDecimal,服务器,数据库,运维

  那就是在这里修复了呀,那它关联的版本是哪个了?

当 SQL Server(mssql-jdbc) 遇上 BigDecimal,服务器,数据库,运维

  然后我们在回到我们搜索 BigDecimal 相关 issue 的时候,你会发现

当 SQL Server(mssql-jdbc) 遇上 BigDecimal,服务器,数据库,运维

   12.2.0 已经发布了

当 SQL Server(mssql-jdbc) 遇上 BigDecimal,服务器,数据库,运维

  如果觉得看英文的费劲,那就看中文的:Microsoft JDBC Driver for SQL Server 发行说明

当 SQL Server(mssql-jdbc) 遇上 BigDecimal,服务器,数据库,运维

  这总看得懂了吧

  那就将 mssql-jdbc 升级到 12.2.0 试试

当 SQL Server(mssql-jdbc) 遇上 BigDecimal,服务器,数据库,运维

  入参不用统一精度,结果也正确了!

  但是,又开始转折了,你以为 12.2.0 就高枕无忧了?

当 SQL Server(mssql-jdbc) 遇上 BigDecimal,服务器,数据库,运维

   BigDecimal 的问题都延续到 12.3.0 了

  此刻大家的心情是怎样的,请评论区留言

总结

  1、当 mssql-jdbc 遇上 BigDecimal ,两种处理方式

    1.1  BigDecimal 类型的入参全部统一成最高精度

    1.2 版本升级到 12.2.0 ,但还是有问题,需要考虑业务是否会触发 12.2.0 的 bug 

  2、  mssql-jdbc 的 BigDecimal 的问题从 2016 年就开始出现了,到了现在( 2023 )还存在问题,我真的想对官方说一句 文章来源地址https://www.toymoban.com/news/detail-672290.html

到了这里,关于当 SQL Server(mssql-jdbc) 遇上 BigDecimal的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【SQL Server】数据库开发指南(二)MSSQL数据库开发对于库、表、数据类型、约束等相关操作

    本系列博文还在更新中,收录在专栏:#MS-SQL Server 专栏中。 本系列文章列表如下: 【SQL Server】 Linux 运维下对 SQL Server 进行安装、升级、回滚、卸载操作 【SQL Server】数据库开发指南(一)数据库设计的核心概念和基本步骤 【SQL Server】数据库开发指南(二)MSSQL数据库开发对

    2023年04月09日
    浏览(342)
  • SQL Server2019详细安装教程(含JDBC连接)

    解压压缩包后得到三个exe文件: 百度网盘链接: windows8以上直接点击 cn_sql_server_2019_developer_x64_dvd_c21035cc.iso 安装即可: 接着点击setup.exe来进行安装: 要是没有反应的话点击 SQL2019-SSEI-Dev.exe 来安装: 1、点击自定义安装 选择安装路径: 安装要等待好一会儿,安装完成之后会

    2024年02月13日
    浏览(43)
  • JDBC连接SQL Server数据库SSL异常问题

     异常如下: com.microsoft.sqlserver.jdbc.SQLServerException: 驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接。错误:“The server selected protocol version TLS10 is not accepted by client preferences [TLS13, TLS12]”。 ClientConnectionId:04a8ece8-757c-411e-9599-734eba7795cd ... 异常中提到客户端偏好

    2024年02月12日
    浏览(51)
  • JDBC如何连接SQL Server数据库实现增删改查

    目录 一、连接前准备  1. 环境配置  2. 下载JAR包 3. 添加环境变量 4. 导入JDBC包  二、连接SQL Server  三、实现增删改查 1. 查询数据 2. 添加数据 3. 修改数据 4. 删除数据 5. 拓展 JDBC的全称是Java数据库连接 (Java DataBase Connectivity) ,应用程序通过JDBC连接到数据库,使用SQL语句对数

    2024年02月03日
    浏览(67)
  • 性能测试jmeter连接数据库jdbc(sql server举例)

    一、下载第三方工具包驱动数据库 1. 因为JMeter本身没有提供链接数据库的功能,所以我们需要借助第三方的工具包来实现。  (有这个jar包之后,jmeter可以发起jdbc请求,没有这个jar包,也有jdbc取样器,但不能发起请求。) 2. 进入maven仓库-http://mvnrepository.com/,找到想要的工

    2024年02月09日
    浏览(52)
  • 性能_3 jmeter连接数据库jdbc(sql server举例)

    一、下载第三方工具包驱动数据库 1. 因为JMeter本身没有提供链接数据库的功能,所以我们需要借助第三方的工具包来实现。  (有这个jar包之后,jmeter可以发起jdbc请求,没有这个jar包,也有jdbc取样器,但不能发起请求。) 2. 进入maven仓库-http://mvnrepository.com/,找到想要的工

    2024年02月11日
    浏览(55)
  • 记录一下Java JDBC连接微软SQL Server遇到的那些坑

    最近忙实习,宅在国内远程办公,然后呢我的西班牙老板又要求我用Java做某个管理系统。由于我的电脑和公司的远程电脑上都装的是SQL Server 2019,为了图方便,我就没有换数据库系统软件,顺便随手建了个库建了个表来测试一下。 表大概长这么一个样子:  插入了一些数据

    2024年02月04日
    浏览(41)
  • Microsoft SQL Server 2019 下载、安装及Java JDBC配置连接数据库(多图详解 超详细)

    一、下载 下载链接Microsoft SQL Server 二、安装 1.找到刚刚下载的文件,双击打开后,选择基本并接受 2.选择接受 3.选择安装位置,并点击安装,然后等待下载安装完成 4.正在安装 -5.遇到了一个问题,重启一下(未遇到该问题的可忽略此步) 6.安装成功,点击安装SSMS 7.点击下载

    2024年02月04日
    浏览(108)
  • 【SQL SERVER】SQL SERVER无法连接到服务器解决过程记录

    很久没用sql server了,这几天打算更新一下 这篇文章,发现连接不上服务器。 找一下解决办法。 一、打开服务界面 在键盘上按“WIN+R”快捷键,打开运行界面,输入“services.msc”指令,按“确定”; 二、找到SQL这一堆,全部启动 打开之后还是不行,之后又重启电脑还是不行

    2024年02月20日
    浏览(56)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包