Oracle10 및 JDBC : Char가 비교에서 후행 공간을 무시하는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/603245

  •  03-07-2019
  •  | 
  •  

문제

나는 쿼리가 있습니다

... 여기서 prt_status = 'ont'...

PRT_STATUS 필드는 char (5)로 정의됩니다. 따라서 항상 공간으로 채워져 있습니다. 쿼리는 결과적으로 아무것도 일치하지 않습니다. 이 쿼리를 작동 시키려면해야합니다

... 여기서 rtrim (prt_status) = 'ont'

작동합니다.

그거 짜증나네.

동시에, 몇 개의 Pure-Java DBMS 클라이언트 (Oracle SQLDeveloper 및 Aquastudio) 첫 번째 쿼리에 문제가 없으며 올바른 결과를 반환합니다. 두꺼비도 문제가 없습니다.

나는 그들이 단순히 연결을 호환성 모드 (예 : ANSI)에 넣었다고 가정하므로 Oracle은 Char (5)가 후행 캐릭터와의 존중이 없을 것으로 예상된다는 것을 알고 있습니다.

응용 프로그램에서 얻는 연결 객체로 어떻게 할 수 있습니까?

업데이트 데이터베이스 스키마를 변경할 수 없습니다.

해결책 실제로 Oracle이 필드를 매개 변수로 전달한 방식이었습니다.

Bind가 완료되면 String은 readstatement.setString ()을 통해 전달되며, 이는 유형을 VarChar로 설정하므로 Oracle은 패딩되지 않은 비교를 사용하여 실패합니다.

setObject (n, str, type.char)를 사용하려고했습니다. 실패합니다. 디 컴파일은 Oracle을 Char를 무시하고 다시 Varchar로 전달한다는 것을 보여줍니다.

마지막으로 작동하는 변형은입니다

setObject(n,str,OracleTypes.FIXED_CHAR);

그래도 코드를 휴대용으로 만듭니다.

UI 클라이언트는 다른 이유로 성공합니다. 바인딩하지 않고 문자 리터럴을 사용합니다. prt_status = 'ont'를 입력하면 'Ont'는 문자 그대로이므로 패딩 방식을 사용하여 비교합니다.

도움이 되었습니까?

해결책

주목하십시오 오라클 비교 CHAR 공백 패드 비교 의미를 사용한 값.

에서 데이터 유형 비교 규칙,

Oracle은 비교의 두 값이 Datatype Char, NCHAR, Text Literals 또는 사용자 함수에 의해 리턴 된 값의 표현 일 때만 빈 상태 비교 의미론을 사용합니다.

당신의 예에서 'ONT' 바인드 매개 변수로 전달 되었습니까? 아니면 설명했듯이 쿼리에 텍스트에 내장되어 있습니까? 바인드 매개 변수 인 경우 유형으로 바인딩되어 있는지 확인하십시오. CHAR. 그렇지 않으면 실제로 사용 된 클라이언트 라이브러리 버전을 확인하십시오. 실제로 오래된 버전의 Oracle (예 : V6)은 다른 비교 의미론을 갖습니다. CHAR.

다른 팁

데이터베이스 테이블을 변경할 수없는 경우 쿼리를 수정할 수 있습니다.

rtrim에 대한 몇 가지 대안 :

.. PRT_STATUS가 'Ont%'와 같은 곳 ...

.. 여기서 prt_status = 'ont'... - 2 뒤의 흰색 공간

.. 여기서 prt_status = rpad ( 'ont', 5, '') ...

나는 char (5) 열을 db의 varchar2 (5)로 바꿀 것이다.

쿼리에서 캐스트를 사용하여 char 작업을 수행 할 수 있습니다.

... WHERE PRT_STATUS=cast('ONT' as char(5))

또는보다 일반적인 JDBC 방식으로 :

... WHERE PRT_STATUS=cast(? as char(5))

그런 다음 JDBC 코드에서 사용됩니다 statement.setString(1, "ONT");

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top