我正在执行这样的句子。
fld1 VARCHAR(5);
Select * from MyTable where fld1 = 'HELLOWORLD';
在表格中只有fld1 =' HELLO'由于某种原因,结果集给我作为fld1 =' HELLO'的结果行。
如果fld1是VARCHAR 5,显然正在削减' HELLOWORLD'为什么查询没有按字面意思取得所有价值?
我的方法:
public void Consulta(){
COB_ConexionModulo connPool = null;
COB_ResultadoConexion rc = null;
Connection con = null;
StringBuffer sbQry = new StringBuffer();
PreparedStatement pstm = null;
ResultSet rs = null;
COB_Utils util = new COB_Utils();
try {
connPool = COB_ConexionModulo.instance();
rc = connPool.getConnection();
con = rc.getConexion();
if(!(con == null)){
sbQry = new StringBuffer("SELECT NAME FROM TEST.MYTABLE WHERE NAME = ?");
pstm = con.prepareStatement(sbQry.toString());
pstm.setString(1, "HELLOWORLD");
util.setInicioEjecucion();
rs = pstm.executeQuery();
util.imprimeTiempoEjecucion(MSINF,sbQry.toString());
while (rs.next()){
System.err.println(rs.getString("NAME"));
}
} else {
logger.info(MSINF + "No hay conexion");
}
} catch (Exception e) {
logger.error(MSERR + "Consulta()_" + e);
}finally {
try {if (con != null) {con.close();con = null;}} catch (SQLException sqle) {con = null;}
}
}
Images in order: 1.- Table Script 2.- Table Values 3.- Query Result.
答案 0 :(得分:1)
我记得同样的效果;诊断出有警告,sqlstate ='01004'“当分配给另一个字符串数据类型时,字符串的值被截断了。”在开放。
我不记得我读过的文件是什么,作为我做出改动的原因,但是参数标记正确地表示了较大的字符串值,从而避免了问题[即为了防止选择较短的值,我基本上编码了OP [虽然将25
调整为所需的值;任何六个或更多的东西就足够了,而DDL仍然是NAME VARCHAR(5)]:
"SELECT NAME FROM TEST.MYTABLE WHERE NAME = CAST( ? AS VARCHAR(25) )"
当然,不太可取:
"SELECT NAME FROM TEST.MYTABLE WHERE CAST( NAME AS VARCHAR(25) ) = ?"
2016年9月30日附录:
PREPARE
的文档解释了OP中显示的用法,指定无类型参数标记,其中“无类型参数标记的数据类型由 context “。来自OP SELECT
的{{1}}语句的谓词中的无类型参数标记与FLD1列建立为相同的数据类型,其显示为… where FLD1 = ?
。 FLD1 VARCHAR(5)
和OPEN
文档分别说明了如何影响参数标记替换的详细信息。为方便起见,我将在这里解释文档中的一些文本,但也包括三个文档链接:
鉴于参数标记
EXECUTE
,相应变量P
的值将分配给为{{1}创建的目标变量}使用存储分配规则,如Assignments and comparisons中所述。 但,与那些存储分配规则不同,如果V
是一个字符串,那么当{1}}分配给P
的目标变量的值时只要该字符串值长于{的目标变量的length属性,语句就会被执行,截断( 没有错误 ) {1}}; 或,只要该字符串值比V
的目标变量的长度属性短,P
的值就会用空格填充。
在下面的每个文档参考中,搜索参数标记, cast 或 Notes 中的任何一个,以获取最具体的详细信息;目前的详细信息可以在 Notes 部分找到:
IBM i 7.2->Database->Reference->SQL reference->Statements->PREPARE
IBM i 7.2->Database->Reference->SQL reference->Statements->EXECUTE
IBM i 7.2->Database->Reference->SQL reference->Statements->OPEN
答案 1 :(得分:-1)
" HELLO"长度为5个字符,这是存储在数据库中的字符,因为NAME被定义为VARCHAR(5)。剩余的如果形成是"修剪" /"丢弃" /"废弃"因此"世界"从DB的角度来看并不存在。