为什么我会收到VARCHAR比较的意外结果?

时间:2016-09-27 19:31:35

标签: java db2 ibm-midrange weblogic12c db2-400

我正在执行这样的句子。

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.

2 个答案:

答案 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的角度来看并不存在。