我正在使用jt400-9.3.jar
连接DB2 / AS400。
我的表BAND
中包含以下记录:
+-----|------------------+
| MAT | NAME |
+-----|------------------+
|100 | Paul McCartney |
|101 | John Lennon |
|102 | Ringo Starr |
|103 | George Harrison |
我的桌子MUSICIAN
带有:
+------|------------------+
|MAT | NAME |
+------|------------------+
|1001 | Pete Best |
|1002 | Stuart Sutcliffe |
|1003 | Jimmy Nicol |
|1004 | Tommy Moore |
|1005 | Norman Chapman |
当我运行此选择时
SELECT t.mt, t.name
FROM (
SELECT
trim(b.mat) AS mat,
trim(b.name) AS name
FROM band b
WHERE trim(b.mat) = '1001'
UNION
SELECT
trim(m.mat) AS mat,
trim(m.name) AS name
FROM MUSICIAN m
WHERE trim(m.mat) = '1001'
) AS t
FETCH FIRST 1 ROWS ONLY
我检索:
+-----|----------------+
|MAT |NAME |
+-----|----------------+
|100 | Paul McCartney |
第一个查询作为like
子句运行。 1001
与100
匹配,但句子为=
否like
。
当我在dbeaver中执行查询时,但是在Java中(使用PreparedStatement),我弄错了,驱动程序有一些配置吗?
答案 0 :(得分:0)
约翰·埃伯哈德(John Eberhard)对我的问题回答得如此之快。
https://sourceforge.net/p/jt400/bugs/121/
注册答案。
问题在于查询中正在使用=。因为=用于 查询,然后数据库告诉驱动程序类型为 CHAR(5)。然后,驱动程序将截断为char 5。
有两种可能的解决方案。
将强制类型转换添加到参数标记,以便较大的字符适合并且比较不正确。 即SELECT * FROM MYTABLE WHERE MAT = CAST(?AS VARCHAR(80))
使用“查询替换截断的参数” JDBC属性。参见https://static.javadoc.io/net.sf.jt400/jt400/9.7/com/ibm/as400/access/doc-files/JDBCProperties.html
此处是该属性的定义方式。
“查询替换截断参数”
指定代替截断应使用的值 SQL查询的参数。默认情况下,该参数为静默 截断为参数的长度。考虑以下 场景。
表T1的CHAR(3)列的名称为C1,其中一行 C1 ='ABC'。应用程序使用SELECT * FROM准备一条语句 TABLE_X其中C1 =?如果参数设置为“ ABCD”,它将是 默默地被截断为“ ABC”,查询将返回一行。
此属性通过允许应用程序设置来避免此问题 字符串到应用程序中不存在的内容-即 @@@@@@@@@。空值表示该属性将被忽略。