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

news2024/11/23 13:20:15

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

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

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

相关文章

网络协议的分类

1.概要 网络协议可以分为三类: 封装协议路由协议功能类协议 2.分类说明 OSPF报文直接调用_ IP协议__协议进行封装,以目的地址_244.0.0.5 __发送到所有的OSPF路由器? 244.0.0.1 所有主机;244.0.0.2 所有路由器;244.0.0.6 指定…

SpringSecurity6集成数据库

本文章对应视频可在B站查看SpringSecurity6对应视频教程,记得三连哦,这对我很重要呢! 温馨提示:视频与文章相辅相成,结合学习效果更强哦! 系列文章链接 1、初识SpringSecurity,认识主流Java权限…

win10系统解除微软账户和本地账户绑定

折腾了好久,终于找到一种方法可以退出微软账号了,不过这种方法我测试是成功的,有人留言自己不成功,具体解决方法只能看这些留言了 win10当中没有注销按钮,win x 弹出的菜单里面有关闭或注销,可以选择注销…

Unity射击游戏开发教程:(15)添加推进器推进和推进器推进动画

这是一个可以添加到我的游戏中的简单而有趣的功能。当玩家按住 Shift 按钮时,速度会加快,松开 Shift 按钮时,速度会恢复到原来的速度。 这需要不同的输入检测。通常使用的是Input.GetKeyDown并传入你想要获取的key。这只会检测在当前帧期间是否按下了按钮,但如果按住,将不…

Hive的join操作

假设有三张表,结构和数据如下:-- 创建表 test_a,test_b,test_c CREATE TABLE test_a( id int, name string ) ROW FORMAT DELIMITED FIELDS TERMINATED BY \t;--分别导入数据到三个表中 --test_a 1 a1 2 a2 4 a4 --test_b 1 b1 3 b3 4 b4 --…

Ubuntu 20.04在Anaconda虚拟环境中配置PyQt4

一、创建一个虚拟环境 1 创建一个python2.7的虚拟环境: conda create -n pyqt4 numpy matplotlib python2.72 在环境中安装几个需要的包: pip install Theano pip install python-opencv3.4.0.14 pip install qdarkstyle pip install dominate二、在主…

打造清洁宜居家园保护自然生态环境,基于YOLOv7【tiny/l/x】参数系列模型开发构建自然生态场景下违规违法垃圾倾倒检测识别系统

自然生态环境,作为我们人类赖以生存的家园,其健康与否直接关系到我们的生活质量。然而,近年来,一些不法分子为了个人私利,在河边、路边等公共区域肆意倾倒垃圾,严重破坏了环境的健康与平衡。这种行为不仅损…

【Python探索之旅】选择结构(条件语句)

文章目录 条件结构: 1.1 if单分支结构 1.2 if-else 多分支结构 1.3 if-elif 多重结构: 完结撒花​ 前言 Python条件语句是通过一条或多条语句的执行结果(True或者False)来决定执行的代码块。 Python提供了顺序、选择、循环三…

2024.5.19 机器学习周报

引言 Abstract 文献阅读 1、题目 X-HRNET: TOWARDS LIGHTWEIGHT HUMAN POSE ESTIMATION WITH SPATIALLY UNIDIMENSIONAL SELF-ATTENTION 2、引言 高分辨率表示是人体姿态估计实现高性能所必需的,随之而来的问题是高计算复杂度。特别地,主要的姿态估…

AI算法-高数5.1-线性代数-向量间的关系

线性代数基础概念见:AI算法-高数5-线性代数1-基本概念、向量-CSDN博客 宋浩老师课程学习: 3.2 向量间的线性关系(一)_哔哩哔哩_bilibili 向量间的关系: ​ ​ ​ ​ 判断向量贝塔(β)是否是阿尔法(α)的线性组…

4.2 试编写一程序,要求比较两个字符串STRING1和STRING2所含字符是否相同,若相同则显示“MATCH”,若不相同则显示“NO MATCH”

方法一:在程序内部设置两个字符串内容,终端返回是否匹配 运行效果: 思路: 1、先比较两个字符串的长度,如果长度不一样,则两组字符串肯定不匹配;如果长度一样,再进行内容的匹配 2、如…

红外遥控和LCD1602

26.1.1 红外线简介 人的眼睛能看到的可见光按波长从长到短排列,依次为红、橙、黄、绿、青、蓝、紫。其中红光的波长范围为 0.62~0.76μm;紫光的波长范围为 0.38~0.46μm。比紫光波长还短的光叫紫外线,比红光波长还长的…

利用光学和SAR数据进行亚马逊热带雨林监测

亚马逊热带雨林,670万平方公里,物种丰富,森林历史悠久。巴西环保局用光学和SAR数据进行森林监测,主要监测森林砍伐范围、人为破坏、非法采矿和隐蔽的飞机跑道。 图 2011年12月森林砍伐范围 在SAR强度数据上,被砍伐的森…

C#语言进阶

一、简单数据结构类 1. ArrayList ArrayList是一个 C# 为我们封装好的类,它的本质是一个 object 类型的数组。ArrayList类帮助我们实现了很多方法,比如数组的增删查改 1.1 声明 using System.Collections;ArrayList array new ArrayList(); 1.2 增…

RabbitMQ--死信队列

目录 一、死信队列介绍 1.死信 2.死信的来源 2.1 TTL 2.2 死信的来源 3.死信队列 4.死信队列的用途 二、死信队列的实现 1.导入依赖 pom.xml 2.application.properties 3.配置类 4.生产者 5.业务消费者(正常消费者) 6.死信队列消费者 一、…

STM32-LCD液晶屏(ILI9341)

MCU:STM32F103VET6 开发环境:STM32CubeMXMDK5 目录 STM32液晶屏LCD(ILI9341) LCD液晶显示 液晶控制原理 ILI9341液晶控制器简介 8080写时序 8080读时序 FSMC模拟8080时序 液晶屏的信号线 STM32CubeMX配置FSMC 测试部分 …

工作玩手机监测识别摄像机

工作场所的员工玩手机已经成为了一种常见的现象,特别是在办公室、生产车间等地方。而这种现象不仅仅影响了员工的工作效率,还可能会对工作安全造成一定的隐患。为了监测和识别员工玩手机的情况,工作玩手机监测识别摄像机应运而生。工作玩手机…

05 | 如何确保消息不会丢失?

检测消息丢失的方法 我们可以利用消息队列的有序性来验证是否有消息丢失。在 Producer 端,我们给每个发出的消息附加一个连续递增的序号,然后在 Consumer 端来检查这个序号的连续性。 如果没有消息丢失,Consumer 收到消息的序号必然是连续递增的,或者说收到的消息,其中的…

物联网实战--平台篇之(六)应用管理后台

目录 一、应用数据库 二、登录记忆 三、新建应用 四、获取应用列表 五、重命名应用 本项目的交流QQ群:701889554 物联网实战--入门篇https://blog.csdn.net/ypp240124016/category_12609773.html 物联网实战--驱动篇https://blog.csdn.net/ypp240124016/category_126313…

2024统计建模成品论文39页(附带完整数据集和代码)

2024统计建模成品论文完整版一等奖论文【1.5w字全网最佳】2024统计建模大赛高质量成品论文39页配套完整代码运行全套数据集https://www.jdmm.cc/file/2710661/