2009-06-03 2 views
0

오라클 9i를 데이터베이스로 사용하는 레거시 ASP 응용 프로그램에 이상한 문제가 발생했습니다. 우리는 최근 DBA에게 VARCHAR2 필드의 크기를 VARCHAR2 (2000)에서 VARCHAR2 (4000)로 증가 시켰습니다. 문제는 삽입 된 문자열이 2000자를 초과하는 경우에도 NULL 바이트 (ASCII : 0)가 문자열의 2001 문자 위치에 삽입된다는 것입니다. 예를 들어, 응용 프로그램이 2500 자의 문자열로 새로운 레코드를 테이블에 삽입하면 VARCHAR2 필드에 2501 개의 문자가 저장되고 2001 바이트 위치에 NULL 바이트가 삽입됩니다. NULL 바이트는 데이터베이스에 저장된 원래 게시 된 데이터의 일부가 아니며 우리에게 슬픔을 안겨줍니다. 혹시 이런 식으로 뭔가를 만난 적이 있습니까? 응용 프로그램에서 MSDAORA ODBC 드라이버를 사용하고 드라이버가 문자열 버퍼에 NULL 문자를 끝내기를 추가하고 있다고 생각합니다. 의 내부 제한은 2000 자입니다.오라클은 varchar2 문자열에 NULL 바이트 (ASCII : 0)를 추가합니다.

아이디어가 있으십니까?

감사합니다.

+0

답장을 보내 주셔서 감사합니다. 범인은 'Oracle 용 Microsoft ODBC'드라이버였습니다. 응용 프로그램에서 MSDAORA를 사용하지 않았습니다. Oracle 10g 드라이버를 사용하도록 ODBC DSN을 재구성하면 문제가 해결되었습니다. –

답변

0

나는 정말로 오라클이 그렇게 생각하지 않는다. RTRIM을 사용하여 insert 문에서 공백을 제거 할 수 있습니다.

0

가는 10,046 추적 레벨 4

alter session set events '10046 trace name context forever, level 4'; 
바인드 값을 포함하는 서버에 추적 파일을 생성합니다

는 (그래서 당신은 널 바이트 문자열의 일부가로 추진되고 있는지 확인할 수 있습니다 SQL).

(예 : 멀티 바이트 문자 세트를 사용하고 있습니까?) 문자 세트가 이상합니까? 환경이 더 이상 할수록 버그를 발견 할 확률이 높아집니다.

마지막 생각은 VARCHAR2 (4000) 대신 CLOB입니다.

관련 문제