2016-09-27 10 views
-2

私はこのような文を実行しています。なぜVARCHAR比較の予期しない結果が得られますか?

fld1 VARCHAR(5); 

Select * from MyTable where fld1 = 'HELLOWORLD'; 

はテーブルでのみFLD1 =「ハロー」、何らかの理由で結果セットは、結果行FLD1 =「ハロー」と私を与えるがあります。

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のために何が必要なのかを調整しました。

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

またはコースの、あまり好ましい:

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

30をSep-2016補遺
DDLながら十分で大きいもの6つはNAME VARCHAR(5)]のままPREPAREのドキュメントでは、OPに表示されている使用法について、タイプ指定されていないパラメータマーカーを指定しています。「型指定されていないパラメータマーカーのデータ型は、コンテキスト " OP … where FLD1 = ?SELECTステートメントの述部にあるタイプのないパラメーターマーカーは、FLD1列と同じデータ型として確立され、FLD1 VARCHAR(5)と判明しました。 OPENおよびEXECUTEのマニュアルでは、それぞれパラメータマーカーの交換の実行方法の詳細が説明されています。私は便宜上、ここではドキュメントからテキストを言い換え、だけでなく、その次の三つドキュメントへのリンクが含まれます:

ターゲットに割り当てられているパラメーター・マーカー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

記録のために:もし誰かがこのシナリオを[運転手との間で]不具合であると理解しているなら、その経験が*その要件をサポートしている実際の文書とリンクしていない*欠陥。私が自分のコードで行ったことは、おそらく正しい動作は、MustaccioがOPへのコメントで最初に言及したものです。つまり、私は医者が私に指示してくれたことを誤って憶えている可能性があります。 – CRPence

+0

多少類似(関連性がある) - [APAR SE26512](http://m.ibm.com/http/www-912.ibm.com/n_dir/nas4apar.nsf/ALLAPARS/SE26512) - CASTパラメータ・マーカー適切なデータ型への迂回は迂回です。 – user2338816

-1

"HELLO" NAMEは、VARCHAR(5)のように定義されているため、DBに格納されているものであり、長さが5つの文字です。残りのフォーメーションは「トリミング」/「ドロップ」/「破棄」されているため、DBの観点からは「ワールド」は存在しません。

関連する問題