2017-09-13 22 views
2

로 문자열을 반환합니다. XML 파일을 CLOB으로 저장하는 테이블이 있습니다. NLS_CHARACTERSETAL32UTF8으로 설정됩니다. java.sql 패키지로 값을 검색하고 ResultSet.getClob().getAsciiStream()을 사용하여 UTF-8 인코딩을 사용하여 문자열로 변환하려고하면 올바른 XML이 표시됩니다.java.sql.ResultSet.getString는() 나는 최근 <strong>자바</strong>와 <strong>오라클 DB</strong>에서 <strong>CLOB</strong> 값을 검색하려고에 문제가 발생하여 추가 문자

그러나 ResultSet.getString()을 사용하면 XML 구문 분석기가 구문 분석 예외로 실패합니다.

디버깅하는 동안 추출 된 값은 this입니다. 그리고 파일의 절반 만 포함합니다.

기타 XML 파일은 ResultSet.getString()과 함께 선택할 수 있습니다.
손상되고 유효한 XML의 ASCII 표현에 눈에 띄는 차이점을 보지 못했습니다.
데이터베이스에 동일한 값을 다시 삽입하면 문제가 해결됩니다.

이 동작을 ResultSet.getString() 방법으로 설명 할 수 있습니까? JDK에 대한 오라클에 대한

정보

Oracle version is 12.1.0.2.0. 

정보 : 내가 어떤 이유로 그 반환 CLOB의 저장 주소를 믿고 당신이 getCLOB으로 그것을 얻을 때 XML을 만드는

java version "1.7.0_131" 
OpenJDK Runtime Environment (rhel-2.6.9.0.0.1.el7_3-x86_64 u131-b00) 
OpenJDK 64-Bit Server VM (build 24.131-b00, mixed mode) 

답변

-1

.

저장된 XML을 확인하십시오. 태그를 닫지 않았거나 저장된 XML 파일에 다른 구문 문제가있을 수 있습니다.

+0

'ResultSet.getString()'과'ResultSet.getClob()'은 저장된 파일의 데이터를 반환합니다. 저장된 XML이 유효합니다. 그리고 내가 지적한 것처럼 데이터베이스에 같은 값을 삽입하면 오류가 사라집니다. –

1

저에게 클락은 실제로 UTF-8로 인코딩되지 않았지만 UTF-16처럼 보입니다. 때때로 data can be written to a column using a charset other than the NLS_CHARACTERSET이 발생할 수 있습니다. 올바른 로컬 charset을 사용하여 데이터를 다시 삽입 할 때 문제가 해결되는 이유를 설명합니다.

Clob.getAsciiStream()에는 ASCII 코드 포인트에 대해 UTF-16과 구별 할 수없는 실수로 인코딩 된 overlong (00-padded) UTF-8에 대한 추가 논리가 있다고 추측합니다.