Oracle DBlink를 복사 할 때 Char (1)가 Char (3)로 변경되는 이유는 무엇입니까?

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

  •  05-07-2019
  •  | 
  •  

문제

2 개의 데이터베이스가 있습니다 데이터베이스 A에서 데이터베이스 B로 char 열이 포함 된 기존 테이블을 전송하고 싶습니다.

데이터베이스 A는 Oracle 9i이며 We8ISO8859p1을 인코딩하고 있으며 1 개의 char (1 char)의 최소 1 열이있는 테이블 "foo"를 포함합니다. 데이터베이스 A의 테이블은 타사 설정의 일부이기 때문에 테이블을 변경할 수 없습니다.

데이터베이스 B는 모든 종류의 이유로 AL32UTF8 인코딩을 사용하여 본인의 Oracle 10G 데이터베이스이며 FOO를이 데이터베이스에 복사하고 싶습니다.

데이터베이스 B에서 데이터베이스 A로 데이터베이스 링크를 설정합니다. 그런 다음 다음 명령을 발행합니다.

* 테이블 바를 선택하여 선택 *에서 #link #.foo; *

데이터가 멋지게 복사되지만 열의 유형을 확인하면 Char (1 char)가 Char (3 char)로 변환되었으며 데이터베이스 B의 데이터를 쿼리 할 때 모두 공백으로 채워져 있습니다. .

오라클은 수중 어딘가에 자신의 바이트와 숯을 혼동한다고 생각합니다. 숯 (1 바이트)은 char (1 char) 등과 다릅니다. 나는 그 모든 것에 대해 읽었습니다.

데이터 유형이 패딩 문자 (3 char)로 변경되는 이유는 무엇입니까?

편집 : Oracle 9와 10의 두 개의 특정 패치 레벨 사이에 Char를 전송하는 것과 관련이있는 것 같습니다. 실제로 버그 인 것 같습니다. 알게 되 자마자 업데이트를 게시하겠습니다. 한편 : 내가 설명한 것처럼 데이터베이스 사이에 Char를 이동하려고하지 마십시오. varchar2는 잘 작동합니다 (테스트).

편집 2 : 답을 찾아서 여기에 게시했습니다. Oracle DBlink를 복사 할 때 Char (1)가 Char (3)로 변경되는 이유는 무엇입니까?내 문제가 해결 되었기 때문에 너무 나쁘다.

도움이 되었습니까?

해결책

이 문제는 Oracle (MIS)이 원래 열 길이 정의를 기반으로 다른 문자 세트 간의 문자 변환을 처리하는 방식으로 인해 발생합니다. 캐릭터 유형 열의 크기를 바이트로 정의 할 때, Oracle은 변환을 수행하는 방법을 알지 못하고이를 바꿉니다. 해결책은 항상 문자의 문자 유형의 길이를 정의하는 것입니다..

문제에 대한 자세한 설명과 내가 이것을 어떻게 생각했는지를 보려면http://www.rolfje.com/2008/11/04/transporting-oracle-chars-over-a-dblink/

다른 팁

WE8ISO8859P1 NLS (하나의 바이트에 문자를 저장)와 최대 4 바이트에 문자를 저장하는 AL32UTF8의 차이점을 배워야합니다. Oracle National Language Support (NLS)와 함께 양질의 시간을 보내야합니다. 선적 서류 비치. Oracle은 도움이되기 위해 데이터베이스 링크를 통해 자동으로 변환을 수행합니다.

SQL 프롬프트에서 다음을 시도하십시오.

ALTER SESSION NLS_NCHAR WE8ISO8859P1 
create table bar as select * from #link#.foo;

내가 시도 할 첫 번째는 CTA가 아니라 열 정의 목록이있는 테이블을 만들고 처음 수천 행의 삽입을 수행하는 것입니다. 그것이 성공하지 못했다면 왜 그 이유가 분명 할 것입니다 ... 그리고 당신은 토마스 로우가 정확하게 죽었다는 신속한 확인을 할 것입니다.

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