2011-08-08 2 views
0

Derby 데이터베이스를 사용 중입니다. 이 쿼리를 작성했습니다 :PreparedStatement에서 BLOB 유형 비교

InputStream is = new java.io.ByteArrayInputStream(BYTES); 
PreparedStatement st11 = conn.prepareStatement("select f from a1 where dBlob =?)"); 
st11.setBlob(1,is,BYTES.length); 

dBlob는 BLOB 데이터 유형입니다. BYTES는 또한 BLOB 데이터 유형입니다. ERROR 42818 :

에 의한 'BLOB'와 'BLOB'사이의 비교는 지원되지 않습니다 내가이 쿼리를 실행할 때

는하지만 다음과 같은 예외를 얻을. 유형을 비교할 수 있어야합니다. 문자열 유형에도 일치하는 데이터 정렬이 있어야합니다. 공동 llation가 일치하지 않는 경우, 가능한 솔루션은 에 기본 데이터 정렬을 강제로 (예를 들어 sys.systables FROM TABLENAME을 선택 WHERE CAST (TABL ENAME AS VARCHAR (128)) = 'T1')를 피연산자를 캐스팅하는 것입니다

이 문제를 방지하기 위해 쿼리를 작성하려면 어떻게해야합니까?

나는 또한 변환하여 시도했다, 그러나 너무 작동하지 않습니다

PreparedStatement st11 = conn.prepareStatement("select f from a1 where dBlob  
=CONVERT(?,BINARY)"); 
st11.setBlob(1,is,BYTES.length); 

을 또한, 전달되는 인수의 데이터 유형을 얻을 수 있습니다? 반사 또는 다른 수단으로

답변

1

BLOB 열에서 직접 검색 할 수 없다는 것은 매우 기본적인 한계이며 사용자가이를 우회 할 수는 없을 것이라고 생각합니다.

응용 프로그램에서 BLOB 데이터의 완전 일치로 데이터베이스를 정기적으로 검색해야하는 경우 일반적으로 내 응용 프로그램에서 데이터베이스에서 VARCHAR (128) 유형의 열을 추가하고 SHA- 해시 컬럼에서 BLOB 값의 1 해시.

그런 다음 데이터베이스를 검색하려면 검색하려는 BLOB의 해시를 계산하고 해시 열을 검색하여 정확한 일치를 찾으십시오.

+0

감사합니다. Bryan. 나는 그 문제를 해결했다. 특정 이유로 PreparedStatement에 설정된 매개 변수의 유형을 비교 중입니다. 모든 LOB에 대해 일반적인 비교 유형을 제공 할 수 있습니까? 아니면 CLOB, BLOB 및 nCLOB 데이터 유형 각각을 구체적으로 비교해야합니까? – krammer