2016-09-27 3 views
-2

나는이 같은 문장을 실행하고 있습니다.VARCHAR 비교 결과가 예기치 않게 나타나는 이유는 무엇입니까?

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

무슨 일이 안 설명 (내가 SQL을 사용하여 재생하려고 할 때 실제로는하지 않습니다). 이 동작을 보여주기 위해 _complete_ minimal 예제를 작성하고 게시하고 DB2 버전 및 플랫폼을 언급 할 수 있습니다. Java 코드에서 오류가 의심됩니다. – mustaccio

+0

어떤 JDBC 드라이버를 사용하고 있습니까? – mustaccio

+0

com.ibm.as400.access.AS400JDBCDriver를 사용하고 있습니다. –

답변

1

동일한 효과를 상기합니다. 진단 된 sqlstate = '01004' "더 짧은 길이의 다른 문자열 데이터 유형에 할당되면 문자열 값이 잘 렸습니다." OPEN.
내가 읽은 문서가 무엇인지, 내가 변경 한 이유가 무엇인지는 모르겠지만 매개 변수 표식이 더 큰 문자열 값을 올바르게 나타내어 문제를 피할 수 있습니다. 더 짧은 값의 선택을 막기 위해서] 나는 본질적으로 OP를 위해 무엇이 될지를 코딩했다. [원하는 것은 무엇이든지간에 25을 조정한다.

"SELECT NAME FROM TEST.MYTABLE WHERE NAME = CAST(? AS VARCHAR(25))" 

또는 물론, 덜 바람직 :

"SELECT NAME FROM TEST.MYTABLE WHERE CAST(NAME AS VARCHAR(25)) = ?" 

30 9 월 2016 부록 :
DDL을하는 동안 충분 큰 것도 6 개는 NAME VARCHAR (5)] 남아 PREPARE에 대한 설명서는 형식화되지 않은 매개 변수 마커을 지정하는 것으로 OP에 표시된 사용법을 설명합니다. "유형이 지정되지 않은 매개 변수 표식의 데이터 형식은 문맥. " OP … where FLD1 = ?SELECT의 술어에있는 형식화되지 않은 매개 변수 표시자는 으로 표시된 FLD1 열과 동일한 데이터 형식으로 설정됩니다. OPENEXECUTE 설명서에는 각각 매개 변수 표식 대체의 적용 방법에 대한 세부 정보가 나와 있습니다. 나는 편의를 위해, 여기에 문서에서 텍스트를 의역하지만, 또한 다음과 같은 세 가지 문서 링크가 포함됩니다

대상에 할당 된 매개 변수 마커 P, 해당 변수 V의 가치를 감안할를 변수는 에 설명 된과 같은 저장 할당 규칙을 사용하여 P에 대해 생성됩니다.그러나 이러한 스토리지 할당 규칙 V하다면 바와 달리 문자열 다음 명령문이 실행 P 대한 목표 변수에 할당 된 값은, (에러없이 ) 절두 될 것이다 그 문자열 값이 P에 대한 목표 변수의 길이 속성보다 길 때마다; 또는 인 경우 해당 문자열 값이 P에 대한 대상 변수의 길이 속성보다 짧을 때 P의 값은 공백으로 채워집니다. 아래의 각 문서 참조에서

, 매개 변수 마커의 검색은 는 가장 구체적인 세부에 도착, 또는 노트 캐스팅; 현재 세부 사항은 참고 섹션에서 찾을 수 있습니다
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

+0

감사합니다 CRPence 도와 주셔서 감사합니다. –

+0

기록을 위해 : 누군가가 [운전 기사와 함께] 결함 인 것으로 이해한다면, 그 경험이 비실용적이라는 증거로서 * 내 경험 * [요구 사항을 지원하는 실제 문서와 링크가 없음]을 고려하지 마십시오. 결함. 제가 직접 작성한 코드는 우스 타치오가 OP에 대한 언급에서 언급 한 것일 수도 있습니다. 즉 나는 의사가 지시 한대로 잘못 기억할 수도 있습니다. – CRPence

+0

다소 비슷합니다 (관련?) - [APAR SE26512] (http://m.ibm.com/http/www-912.ibm.com/n_dir/nas4apar.nsf/ALLAPARS/SE26512) - CASTing 매개 변수 표시 자 적절한 데이터 유형에 대한 우회는 우회입니다. – user2338816

-1

"HELLO"NAME이 VARCHAR (5)로 정의되어 있기 때문에 DB에 저장되는 것입니다 길이가 5 개 문자입니다. 남아있는 if 형성은 "트리밍"/ "Dropped"/ "Discarded"이므로 "World"는 DB의 관점에서 존재하지 않습니다.