인성장

[Oracle][ORA-01756] 한글 데이터 Insert 시 관련 오류 본문

Oracle/Error

[Oracle][ORA-01756] 한글 데이터 Insert 시 관련 오류

인성장 2024. 1. 11. 15:17

 
Error Message

ORA-01756: quoted string not properly terminated.

 
원인
위 오류는 작은 따옴표( ' ) 가 빠졌을 때 발생하는 오류이나, 작은 따옴표를 잘 썼는데도 불구하고 sqlplus에서 한글 데이터를 Insert 할 경우에도 발생됩니다. 이유는 OS 상의 NLS_LANG 환경변수 설정값이 원인인데, 일반적으로 NLS_LANG 설정값과 DB CharacterSet 설정값이 다르면 해당 오류가 나타나는 것으로 많이들 알고 있습니다.
 
그러나, 아래와 같이 OS 상 NLS_LANG 값과 DB의 CharacterSet 값을 일치시켜주었는데도 불구하고 한글데이터를 넣을 때 ORA-01756 오류가 발생하였습니다.
 
 
1. DB CharacterSet 정보 확인

SQL> set line 200
set pages 300
col name for a30
col value$ for a40
col comment$ for a60
select * from sys.props$ where name like 'NLS%';

NAME                           VALUE$                                   COMMENT$
------------------------------ ---------------------------------------- ------------------------------------------------------------
NLS_CSMIG_SCHEMA_VERSION       5                                        Character set migration utiltiy schema version #
NLS_LANGUAGE                   AMERICAN                                 Language
NLS_TERRITORY                  AMERICA                                  Territory
NLS_CURRENCY                   $                                        Local currency
NLS_ISO_CURRENCY               AMERICA                                  ISO currency
NLS_NUMERIC_CHARACTERS         .,                                       Numeric characters
NLS_CHARACTERSET               KO16MSWIN949     <--- DB 캐릭터셋        Character set
NLS_CALENDAR                   GREGORIAN                                Calendar system
NLS_DATE_FORMAT                DD-MON-RR                                Date format
NLS_DATE_LANGUAGE              AMERICAN                                 Date language
NLS_SORT                       BINARY                                   Linguistic definition
NLS_TIME_FORMAT                HH.MI.SSXFF AM                           Time format
NLS_TIMESTAMP_FORMAT           DD-MON-RR HH.MI.SSXFF AM                 Time stamp format
NLS_TIME_TZ_FORMAT             HH.MI.SSXFF AM TZR                       Time with timezone format
NLS_TIMESTAMP_TZ_FORMAT        DD-MON-RR HH.MI.SSXFF AM TZR             Timestamp with timezone format
NLS_DUAL_CURRENCY              $                                        Dual currency symbol
NLS_COMP                       BINARY                                   NLS comparison
NLS_LENGTH_SEMANTICS           BYTE                                     NLS length semantics
NLS_NCHAR_CONV_EXCP            FALSE                                    NLS conversion exception
NLS_NCHAR_CHARACTERSET         AL16UTF16                                NCHAR Character set
NLS_RDBMS_VERSION              11.2.0.4.0                               RDBMS version for NLS parameters

21 rows selected.

 
2. OS 상 NLS_LANG 변수값 확인

$ echo $NLS_LANG
AMERICAN_AMERICA.KO16MSWIN949

 
3. 한글 데이터 입력 테스트

$ sqlplus / as sysdba

SQL*Plus: Release 11.2.0.4.0 Production on Thu Jan 11 15:06:47 2024

Copyright (c) 1982, 2013, Oracle.  All rights reserved.


Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> insert into test values ('한글테스트');
ERROR:
ORA-01756: quoted string not properly terminated        <--- 오류 발생

 
이와 같이 DB CharaterSet, OS NLS_LANG 두 값이 동일한 캐릭터셋을 가지는데도 해당 오류가 발생했습니다.
 
 
 
 
해결방법
DB CharacterSet 값에 상관없이 OS NLS_LANG 환경변수 값은 AL32UTF8 또는 UTF8로 설정해주시면 됩니다.

$ export NLS_LANG=AMERICAN_AMERICA.AL32UTF8

 
이 후, sqlplus에서 한글 데이터가 정상적으로 들어가는 것을 확인 할 수 있습니다.

$ export NLS_LANG=AMERICAN_AMERICA.AL32UTF8
$ sqlplus / as sysdba

SQL*Plus: Release 11.2.0.4.0 Production on Thu Jan 11 15:12:30 2024

Copyright (c) 1982, 2013, Oracle.  All rights reserved.


Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> insert into test values ('한글테스트');

1 row created.

SQL> select * from test;

NAME
----------------------
한글테스트

 
Summary
OS NLS_LANG 환경변수 설정값은 반드시 DB CharacterSet과 동일할 필요가 없습니다. DB의 데이터는 사용자로 전달될 때, NLS_LANG에 설정된 CharacterSet에 기반에 적절히 변환되어 전달됩니다. (반대의 경우도 동일)
OS 상 NLS_LANG 변수는 DB에게 사용자의 환경을 알려주는 인식표와 같아, 서버 운영체제의 문자셋, 언어셋 환경에 맞춰 설정해주시면 됩니다. 별도 LANG 변수 설정 없을 시, 대부분의 리눅스 서버(한국 기준) LANG 변수값은 *.UTF-8 로 설정되어 있을 것입니다.

 
 
서버 인코딩 설정 확인

$ echo $LANG
ko_KR.UTF-8