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

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

  • 背景描述
  • 问题分析
  • 问题处理
    • 方案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.hqwc.cn/news/700081.html

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

相关文章

《四》系统模块整体功能关联与实现

在上一篇里,我们完成了动作的创建,那么这一次,我们把它加载到界面上,把需要是实现的动作都加上。 MyWord::MyWord(QWidget *parent): QMainWindow(parent) {mdiAreanew QMdiArea;mdiArea->setHorizontalScrollBarPolicy(Qt::S…

Python爬虫逆向——某公开数据网站实例小记(二)

注意!!!!某XX网站逆向实例仅作为学习案例,禁止其他个人以及团体做谋利用途!!! 第一步:分析页面和请求方式 aHR0cHM6Ly95Z3AuZ2R6d2Z3Lmdvdi5jbi8jLzQ0L2p5Z2c 此网站经…

ORACLE ODA一体机存储节点电源故障的分析处理

近期,某用户的ORACLE ODA一体机在例行机房巡检时出现亮黄灯告警;用户反馈次问题后我们立刻通过远程方式,登陆ODA的控制台进行查看; 对于ODA一体机(2个计算节点1个存储节点),计算节点可以通过il…

HTTP协议及应用

一.HTTP协议 1.HTTP协议版本 HTTP1.0:服务器处理完成后立即断开TCP连接(无连接),服务器不跟踪每个客户端也不记录过去的请求(无状态); HTTP1.1:KeepAlived长连接避免了连接建立和…

卷积神经网络CNN的运行过程、常见术语与问题

目录 一、CNN运行过程 1、卷积(Convolution) 2、激活函数(activation function) 3、池化(pooling) 3.1 池化操作 3.2 池化过程 3.3 池化后结果 4、Flatten 5、全连接层 Flatten层的操作 全连接层…

MyBatis常见报错:org.apache.ibatis.binding.BindingException

哈喽,大家好,我是木头左! 异常现象描述 当开发者在使用MyBatis进行数据库操作时,可能会遇到org.apache.ibatis.binding.BindingException: Parameter appId not found这样的错误提示。这个错误通常会让程序无法正常运行&#xff…

namenode启动失败 org.apache.hadoop.hdfs.server.common.InconsistentFSStateException:

小白的Hadoop学习笔记 2024/5/14 18:26 文章目录 问题解决报错浅浅分析一下core-ste.xml 问题 namenode启动失败 读日志 安装目录下 vim /usr/local/hadoop/logs/hadoop-tangseng-namenode-hadoop102.log2024-05-14 00:22:46,262 ERROR org.apache.hadoop.hdfs.server.namen…

ov通配符证书1590

OV通配符SSL证书也可以称之为OV企业型泛域名SSL证书,指的是专为企事业单位准备的通配符SSL证书,不仅可以用一张SSL证书保护主域名以及主域名下所有的子域名,还可以为多个域名网站进行身份认证服务。今天就随SSL盾小编了解性价比较高的OV通配符…

端口号查询进程PID

情况1:由于 idea 突然闪退,导致正在 debug 的 Java 进程没结束掉,端口还在占用,重新 debug 不了,所以需要到任务管理器把进程结束掉 但问题是如果当任务管理器进程同时有多个 Java 进程在运行(而且名字一样…

涨点神器:即插即用特征融合模块!超低参数,性能依旧SOTA

在写论文时,一些通用性模块可以在不同的网络结构中重复使用,这简化了模型设计的过程,帮助我们加快了实验的迭代速度。 比如在视觉任务中,即插即用的特征融合模块可以无缝集成到现有网络中,以灵活、简单的方式提升神经…

推荐5个实用的工具软件,提高效率

​ 现在,有很多实用的工具和软件可以帮助我们更高效地完成各种任务。以下是几个值得推荐的工具和软件,能够极大地提高我们的工作效率。 1.浏览器插件——SuperCopy ​ SuperCopy是一款浏览器插件,主要用于增强网页文本的复制功能。它解决了…

曲线救国:window 安装 docker

你好,我是 shengjk1,多年大厂经验,努力构建 通俗易懂的、好玩的编程语言教程。 欢迎关注!你会有如下收益: 了解大厂经验拥有和大厂相匹配的技术等 希望看什么,评论或者私信告诉我! 文章目录 一…