현상
Tibero에서 Oracle DB Link를 사용하여 INSERT를 수행하는 과정에서, CHAR 타입 컬럼의 사이즈가 달라지면서 데이터가 해당 길이에 맞춰 공백까지 포함된 형태로 전달되었습니다.
이로 인해 INSERT 시도 시 애플리케이션(AP) 단에서 오류가 발생하는 현상이 나타났습니다.
참고
Tibero 5 SP1 (mswin949)에서 Tibero 7 FS02 (mswin949)로 업그레이드를 진행하는 과정에서 발생한 문제입니다.
원인
이슈의 원인은 dblink gateway의 기본 문자셋이 UTF-8로 변경되면서, 문자셋이 두 번 변환되는 과정에서 공백이 삽입되는 현상이 발생한 것입니다.
문자셋 변환 경로는 아래와 같습니다.
Tibero (mswin949) → Gateway (UTF-8) → Oracle (mswin949)
SQL
복사
1.
Gateway와 Oracle의 문자셋이 다른 경우, Gateway는 자신의 문자셋(UTF-8 등)에 맞게 데이터를 변환하여 Oracle에 전달합니다.
2.
Tibero가 Gateway로부터 데이터를 받아올 때, Tibero와 Gateway 간의 문자셋이 다르면 Tibero에서 한 번 더 문자셋 변환이 발생합니다.
3.
Procedure를 통해 데이터를 조회하는 경우, PSM에서는 BIND 정보를 설정할 때 문자셋 변환으로 인해 문자열 길이가 늘어날 수 있으며, 이에 따라 변환된 META 정보 기준으로 크기를 설정하게 됩니다.
4.
이로 인해 CHAR 타입의 BIND 파라미터 뒤에 불필요한 공백이 추가되거나, CTAS (Create Table As Select) 시에도 변환된 META 정보를 기반으로 테이블이 생성되어 원래보다 길이가 증가된 컬럼이 생성될 수 있습니다.
해결
tbgateway의 문자셋 설정을 변경하여 문제를 해결하였습니다.
Tibero 7부터는 tbgateway의 기본 문자셋이 UTF-8로 설정되어 있습니다.
이에 따라, tbgw.cfg 파일 내 CHARACTER_SET 값을 MSWIN949로 변경한 뒤 tbgateway를 재기동하여 문제를 해결할 수 있습니다.
•
Tibero 5 gateway 기본 character set : MSWIN949
•
Tibero 7 gateway 기본 character set : UTF8
참고
•
문제가 발생한 Procedure에서 TRIM 함수를 사용하여 공백을 제거하는 방식으로 우회할 수 있으며, 사이드 이펙트는 없습니다.
•
다만, 이는 임시적인 해결책으로 컬럼의 길이를 정확하게 가져오고 편의성을 확보하기 위해서는 tbgw.cfg 파일에서 CHARACTER_SET을 수정하는 방법이 바람직합니다.