Q & A

FAQ-F097 : CHARSET : KO16MSWIN949, NCHARSET : AL16UTF16 사용시 중국어 깨짐현상

Date2025.03.26 / Hit : 31

해당 현상확인 결과, CHARACTERSET – KO16MSWIN949 / NCHARACTERSET – AL16UTF16의 경우,
정상적으로 중국어 입력이 불가한 것으로 판단되었습니다.

OCI를 사용하여 직접 SQL 문장(INSERT INTO 테이블 VALUES ('값'))을 실행할 경우, 중국어 문자 입력이 정상적으로 이루어지지 않을 수 있습니다. 이는 OCI의 문자셋 처리 방식과 관련이 있습니다.

1. OCI의 문자셋 처리 방식
OCI에서는 NLS_LANG 환경 변수를 사용하여 클라이언트 문자셋을 설정합니다.
OCI에서는 문자셋을 기반으로 문자열을 해석하는데, SQL 문장 내부의 문자열 리터럴('중국어문자')이 클라이언트 문자셋으로 변환된 후 서버로 전달됩니다.
서버에서 NLS_CHARACTERSET에 따라 해당 문자열을 다시 변환하여 저장하는 과정에서,
클라이언트 문자셋과 서버 문자셋이 일치하지 않으면 문자 손실이 발생할 수 있습니다.

특히, VARCHAR2 타입은 NLS_CHARACTERSET(예: KO16MSWIN949)으로 저장되므로, 중국어 입력이 제대로 저장되지 않을 가능성이 높습니다.
NVARCHAR2는 NLS_NCHAR_CHARACTERSET(예: AL16UTF16)으로 저장되지만,
SQL 문장에서 직접 N'중국어' 입력 시에도 클라이언트 문자셋과의 불일치로 인해 깨질 수 있습니다.

2. JDBC와의 차이점
JDBC에서는 oracle.jdbc.defaultNChar=true / charactersetEncoding등의 Connection Property를 통해,
NVARCHAR2 컬럼에 대한 처리를 명확하게 지정할 수 있습니다.
따라서, JDBC는 바인드 변수를 사용하지 않더라도 비교적 정상적으로 중국어를 입력할 수 있습니다.
하지만 OCI에서는 이러한 설정이 제한적이며, 직접 SQL 문장을 통한 입력 시 깨질 가능성이 높습니다.

3. 해결 방법: 바인드 변수 사용
따라서 OCI 환경에서 중국어를 올바르게 입력하려면 반드시 바인드 변수를 사용해야 합니다.
OCI는 OCIStmtBindByName 또는 OCIStmtBindByPos를 통해 명시적으로 문자열의 문자셋을 지정할 수 있으므로, 바인드 변수를 사용하면 입력이 정상적으로 처리됩니다.

 

Orange 에서 Insert 구문에 대해서도 중국어에 대해 직접 입력대신, Bind 변수 사용시 정상적으로 입력되는 것을 확인하실수 있습니다.

 

예를 들어,

SELECT A, B, C WHERE C=N'중국어';  대신

SELECT A, B, C WHERE C=:a; 입력후 :a 에 대해 '중국어' 를 입력하시면 정상적으로 사용 가능합니다.

 

 

  • 대표전화
    1660-1675

  • 기술 문의
    02-6931-1734

  • 오렌지 문의
    070-8666-8175

  • 라이선스 문의
    02-6931-1728