达梦数据库 报错 数据类型不匹配

达梦数据库 报错 数据类型不匹配

  • 背景描述
  • 问题分析
  • 问题处理
    • 方案1:
    • 方案2:
    • TO_CHAR(str)
    • CAST(value AS type)
    • CONVERT(type,value)
    • DBMS_LOB 包
    • TEXT_EQUAL(n1,n2)
  • 写在最后

背景描述

本文写于初接触到达梦(DM)数据库,之前没有用过,因此对于DM数据库还处在摸索阶段。过去一直用的是Mysql数据库,今天在开发过程中用到了一个查询,查询语句很简单,查询语句如下

select * from sys_dict_data where is_valid = 1 and status = 1 and "sys_dict_data"."dict_type"='courseCategory' and to_char(dict_value)='1001';

在DM数据库管理工具执行sql可以正常执行,如图
在这里插入图片描述
但是sql放在Java代码中执行时却报错:第1 行附近出现错误: 数据类型不匹配;

### The error occurred while executing a query### SQL: select * from sys_dict_data where is_valid = 1 and status = 1 and dict_type=? and dict_value= ?### Cause: dm.jdbc.driver.DMException: 第1 行附近出现错误:数据类型不匹配; 第1 行附近出现错误:数据类型不匹配; nested exception is dm.jdbc.driver.DMException: 第1 行附近出现错误:数据类型不匹配at org.springframework.jdbc.support.SQLStateSQLExceptionTranslator.doTranslate(SQLStateSQLExceptionTranslator.java:104)at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:72)at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:81)at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:81)at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:73)at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:446)at com.sun.proxy.$Proxy102.selectOne(Unknown Source)at org.mybatis.spring.SqlSessionTemplate.selectOne(SqlSessionTemplate.java:166)

那么这是为什么呢?

问题分析

首先这个sql本身很简单,就是传入两个参数进行数据查询,在DM管理工具执行也没有问题,可以正常查询,只是在Java代码中查询时报错。为了快速的定位问题,去网上百度了一下同样遭遇的小伙伴,看到可能是DM数据库的text类型字段不支持比较导致的,于是查看了一下表结构
在这里插入图片描述
看到查询条件中涉及到的字段确实是text类型,那么为什么DM管理工具执行却没有报错呢?是因为DM管理工具将text类型字段转换成了varchar类型所以没有报错
在这里插入图片描述
而Java代码中编译sql的时候就已经报错了
在这里插入图片描述
在这里插入图片描述
如果将Java中打印的有占位符的sql放在DM管理工具执行的话也是会复现错误的
在这里插入图片描述

问题处理

到这里也就知道问题所在了,那么如何处理呢?

方案1:

首先可以考虑根据实际情况设计字段,对于字典表设计text类型的字段,完全可以改为varchar(1024)就够用了,设计text类型浪费存储空间还影响数据库性能,那么既然已经如此设计了,不能改表结构只能通过其他方案折中。

方案2:

like
尝试like关键字查询,改写sql

select * from sys_dict_data where is_valid = 1 and status = 1 and "sys_dict_data"."dict_type"='courseCategory' and dict_value like '1001';

可以正常查询,但是

达梦数据库对大字段文本的like比较是有限制的,受参数CLOB_LIKE_MAX_LEN的影响,默认值10240KB,最大上限是102400KB。如果遇到超过10MB的文本内容,请及时调整参数值,并且它需要重启数据库生效。正因为只支持100MB的文本内容,超过100MB,就应该换用其他方法解决,即不再适合。

DM数据库CLOB_LIKE_MAX_LEN参数的查询可以通过以下sql语句查询

select * from v$parameter where NAME='CLOB_LIKE_MAX_LEN';

查询结果如图
在这里插入图片描述
或者通过sql查询

select * from v$dm_ini where PARA_NAME='CLOB_LIKE_MAX_LEN';

在这里插入图片描述
执行方案1的sql查看执行计划,发现也经历了类型转换
在这里插入图片描述

TO_CHAR(str)

可以使用TO_CHAR(str)函数将 VARCHAR、CLOB、TEXT 类型的数据转化为 VARCHAR 类型输出。VARCHAR 类型的长度不能超过 32767 个字节,CLOB、TEXT 类型的长度不能超过 32766 个字节。查询语句如下

select * from sys_dict_data where is_valid = 1 and status = 1 and "sys_dict_data"."dict_type"='courseCategory' and to_char(dict_value)= ?;

to_char转化之后传入?占位符,不会直接报错,而是提示输入参数
在这里插入图片描述

CAST(value AS type)

或者也可以使用CAST(value AS type)将参数 value 转换为 type 类型返回。类型之间转换的相容性如下表所示:表中,“允许”表示这种语法有效且不受限制,“-”表示语法无效,“受限”表示转换还受到具体参数值的影响。
数值类型为:精确数值类型和近似数值类型。
精确数值类型为:NUMERIC、DECIMAL、BYTE、INTEGER、SMALLINT。
近似数值类型为:FLOAT、REAL、DOUBLE PRECISION。
字符串为:变长字符串、固定字符串和 ROWID 类型。其中 ROWID 类型只能和字符串中的 VARCHAR(或 VARCHAR2)相互转换。
变长字符串为:VARCHAR、VARCHAR2。
固定字符串为:CHAR、CHARACTER。
ROWID 类型:ROWID。
字符串大对象为:CLOB、TEXT。
二进制为:BINARY、VARBINARY。
二进制大对象为:BLOB、IMAGE。
判断类型为:BIT、BOOLEAN。
日期为:DATE。时间为:TIME。时间戳为:TIMESTAMP。
时间时区为:TIME WITH TIME ZONE。
时间戳时区为:TIMESTAMP WITH TIME ZONE。
年月时间间隔为:INTERVAL YEAR TO MONTH、INTERVAL YEAR、INTERVAL MONTH。
日时时间间隔为:INTERVAL DAY、INTERVAL DAY TO HOUR、INTERVAL DAY TO MINUTE、INTERVAL DAY TO SECOND、INTERVAL HOUR、INTERVAL HOUR TO MINUTE、INTERVAL HOUR TO SECOND、INTERVAL MINUTE、INTERVAL MINUTE TO SECOND、INTERVAL SECOND。
如图
在这里插入图片描述
cast语句示例

select * from sys_dict_data where is_valid = 1 and status = 1 and "sys_dict_data"."dict_type"='courseCategory' and cast(dict_value as VARCHAR)= ?;

执行效果如图,不会直接报错,而是提示输入参数
在这里插入图片描述

CONVERT(type,value)

使用CONVERT(type,value)函数,用于当 INI 参数 ENABLE_CS_CVT=0 时,将参数 value 转换为 type 类型返回。其类型转换相容矩阵与函数 CAST()的相同,查询语句sql

select * from sys_dict_data where is_valid = 1 and status = 1 and "sys_dict_data"."dict_type"='courseCategory' and convert(varchar,dict_value)= ?;

执行结果如图,提示输入参数
在这里插入图片描述

DBMS_LOB 包

兼容 ORACLE 的 DBMS_LOB 包,用于对大对象(BLOB、CLOB)进行操作所提供的一系列方法的集合。
SUBSTR
获取指定偏移开始的指定长度的子串
语法如下

FUNCTION SUBSTR(LOB_LOC   IN  BLOB,AMOUNT    IN  INTEGER := 32767,OFFSET    IN  INTEGER := 1) RETURN VARBINARY;FUNCTION SUBSTR(LOB_LOC   IN  CLOB,AMOUNT    IN  INTEGER := 32767,OFFSET    IN  INTEGER := 1) RETURN VARCHAR2;FUNCTION SUBSTR(FILE_LOC  IN  BFILE,AMOUNT    IN  INTEGER := 32767,OFFSET    IN  BIGINT := 1) RETURN VARBINARY;

参数详解

LOB_LOC :临时大对象。FILE_LOC:BFILE 对象。AMOUNT:读取的数据长度,BLOB 为字节,CLOB 为字符,上限为 32767,实际获取为大对象长度与 AMOUNT 的小值。OFFSET:读取数据的起始偏移。返回值:返回指定偏移开始的指定长度的子串。若输入的 AMOUNT 或 OFFSET 参数非法,返回 NULL。

sql语句如下

select * from sys_dict_data where is_valid = 1 and status = 1 and "sys_dict_data"."dict_type"='courseCategory' and dbms_lob.substr(dict_value)= ?;

执行结果如图,没有直接报错,输入参数即可
在这里插入图片描述

TEXT_EQUAL(n1,n2)

返回 n1,n2 的比较结果,完全相等,返回 1;否则返回 0。n1,n2 的类型为 CLOB、TEXT 或 LONGVARCHAR。如果 n1 或 n2 均为空串或 NULL,结果返回为 1;否则只有一个为空串或为 NULL,结果返回 0。不忽略结果空格和英文字母大小写。sql示例代码

select * from sys_dict_data where is_valid = 1 and status = 1 and "sys_dict_data"."dict_type"='courseCategory' and TEXT_EQUAL(dict_value,?);

执行结果如图,指定参数即可查询成功
在这里插入图片描述
这个函数的字节数满足条件。

写在最后

到这里,关于DM数据库查询条件中涉及到text类型字段传参查询时报错的问题也就算处理完了,前面几种解决方案长度不能超过 32767 个字节,如果您的字段确实需要text类型的话可以尝试最后一种,TEXT_EQUAL函数支持text最大长度。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/11628.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

电脑快速搜索文件及文件夹软件——Everything

一、前言 Everything是一款由voidtools开发的文件搜索工具,主要运行于Windows操作系统上。它的主要功能是快速、高效地搜索电脑上的文件和文件夹名称。Everything通过利用NTFS文件系统的MFT(主文件表)来索引文件,从而实现几乎实时…

基于SpringBoot + MySQL的宠物医院管理系统设计与实现+毕业论文+指导搭建视频

系统介绍 项目的使用者可以避免排队挂号,比较方便,也方便于宠物医院的管理。现在的宠物本系统根据华阳社区宠物医院管理工作流程将系统使用者划分为三类,分别为、宠物医生、宠物主人以及系统管理人员,以下是对该三类类用户的具体…

Jmeter内存溢出原因及解决办法

现在越来越多的小伙伴在压力测试过程中选择使用Jmeter,原因是这个工具开源且小巧,而且还支持二次开发。 但是事情都有两面性,利弊共存啊,对比商业软件Loadrunner,Jmeter在高并发,特别是大型项目的高并发&a…

浏览器执行渲染原理

一、事件循环 事件循环(Event Loop)是JavaScript的执行环境的核心概念之一,它负责处理JavaScript中的异步操作和执行顺序。事件循环使得JavaScript能够在单线程上有效地处理并发,同时保持编程模型的简单性。 以下是事件循环的一…

使用Eigen将经纬度、高程、偏北角转成变换矩阵

目录 1、前言 2、示例 3、代码解析 4、垂直于给定点的切平面变换 5、代码解析 1、前言 在地球表面进行刚体变换时候,要将具有经纬度、高程和偏北角的坐标信息转换为变换矩阵表达,首先需要了解坐标系之间的转换关系。 通常,我们会将经纬…

AI2024(64bit) Adobe Illustrator 软件安装包下载

AI2024(64bit) Adobe Illustrator 软件安装包下载地址: 百度网盘下载https://pan.baidu.com/s/1C10-2JVN1rxFF5VFRuV2Yw?pwdSIMS 在创意设计的浩瀚宇宙中,Adobe Illustrator 2024如同一颗璀璨新星,以其无与伦比的创新功能和优化体验&#x…

快团团新人怎么找供货团长?免费教程一学就会!

作为快团团的新手,想要寻找供货团长,可以按照以下步骤进行: 打开微信:首先,在您的手机上打开微信应用。 搜索快团团:在微信顶部的搜索框中输入“团长运营之家”,选择出现的“团长运营之家”公号…

搭建网站式个人网盘-超仿Windows界面

搭建网站式个人网盘-超仿Windows界面 效果图部分源码领取源码下期更新预报 效果图 一款网站式个人网盘源码-Windows界面相等于一个网站式电脑可以放照片,视频-支持在线播放(你懂的)我觉得式一款很不错的个人网盘提醒:千万不要升级…

【STM32HAL库】DAC输出0-3.3v

一、简要介绍一下DAC DAC也有分辨率,转换时间,精度等 分辨率常见为8或12位的 转换时间F1,F4,F7都是3us左右,而H7系列是1.7us 1.DAC框图 2.数据格式(对齐方式) 3.触发源 4.可以发送DMA请求 注意&#xff…

【知识碎片】2024_05_13

本文记录了两道代码题【自除数】和【除自身以外数组的乘积】(利用了前缀积和后缀积,值得再看),第二部分记录了关于指针数组和逗号表达式的两道选择题。 每日代码 自除数 . - 力扣(LeetCode) /*** Note: T…

类与对象(二)

封装 封装作为面向对象三大特性(封装,继承,多态)之一,那如何实现封装性的呢?就又得拿出上面的访问修饰限定符的图 public: 就是在任何地方都可以访问 protected: 涉及子类在介绍继承时详细介绍 default: …

分类预测 | Matlab实现DBO-CNN-SVM蜣螂算法优化卷积神经网络结合支持向量机多特征分类预测

分类预测 | Matlab实现DBO-CNN-SVM蜣螂算法优化卷积神经网络结合支持向量机多特征分类预测 目录 分类预测 | Matlab实现DBO-CNN-SVM蜣螂算法优化卷积神经网络结合支持向量机多特征分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.Matlab实现DBO-CNN-SVM蜣螂算法…

APP反抓包 - 客户端证书验证进阶(代码混淆)

1.关于混淆 在安卓开发中,对于第三方的包是可以进行混淆的,例如:OKHttp3.Http.Cert.check 被混淆后可以是a.f.c.b 形式。在安卓开发中,系统包是无法混淆的,例如:java.security.KeyStore不会被混淆。由于这种的情况的存在,再次审示我们之前的通用脚本,就会发现他是不通用…

计算机Java项目|Springboot房产销售系统

作者主页:编程指南针 作者简介:Java领域优质创作者、CSDN博客专家 、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO特邀作者、多年架构师设计经验、腾讯课堂常驻讲师 主要内容:Java项目、Python项目、前端项目、人工智能与大数据、简…

mybatis-plus(2)

上文我们介绍完mybatis-plus的常用注解,现在介绍 mp的基础的yaml配置 mybatis-plus:type-aliases-package: #该位置写 数据库对应实体类的全路径global-config:db-config:id-type: auto # 全局id类型为自增长 mp同时也是支持手写sql,而且mapper的读取地…

如何用 OceanBase做业务开发——【DBA从入门到实践】第六期

当应用一款新的数据库时,除了基础的安装部署步骤,掌握其应用开发方法才是实现数据库价值的关键。为此,我们特别安排了5月15日(周三)的《DBA 从入门到实践》第六期课程——本次课程将带大家了解OceanBase数据库的开发流…

【爬虫】爬取股票历史K线数据写入数据库(三)

前几天有写过两篇: 【爬虫】爬取A股数据写入数据库(二) 【爬虫】爬取A股数据写入数据库(一) 现在继续完善,分析及爬取股票的历史K线数据通过ORM形式批量写入数据库。 2024/05,本文主要内容如下…

JavaScript数字(Number)个数学(Math)对象

目录 前言: Number(数字)对象 前言: nfinity(正负无穷大): NaN(非数字): Number的属性 Number的方法 构造函数 静态方法 实例方法 Math(数学)对象…

【数据结构】详解队列

现在我们来掌握一下队列!如果有对往期知识有不足地方,可翻阅之前文章哦! 个人主页:小八哥向前冲~-CSDN博客 所属专栏:数据结构【c语言版】_小八哥向前冲~的博客-CSDN博客 栈和队列的实现其实都是对你顺序表和链表的检验…

Dev-C++的下载和安装教程(超详细图文,小白入门)

Dev-C(或者叫做Dev-Cpp)是Windows环境下的一个轻量级C/C集成开发环境(IDE)。它是一款自由软件,遵守GPL许可协议分发源代码。 Dev-C集合了功能强大的源码编辑器、MingW64/TDM-GCC编译器、GDB调试器和AStyle格式整理器等…