개요
캐릭터셋(Character set)이 제대로 확인되지 않을 경우, 확인 가능한 항목들에 대하여 서술합니다.
방법
terminal encoding 확인
DB Character set 조회
아래 예시와 같이 대만어가 캐릭터셋에서 지원하는 문자인지 조회합니다.
SQL> select * from sys._vt_nls_character_set;
CHARACTERSET_NAME NCHAR_CHARACTERSET_NAME
----------------- -----------------------
EUCTW UTF16
SQL
복사
리눅스 locale 확인
locale은 사용자 인터페이스에서 사용되는 언어, 지역 설정, 출력 형식 등을 정의하는 문자열입니다.
# 지원하는 locale 리스트 조회
$ locale -a
C
POSIX
EN_US.UTF-8
EN_US
KO_KR.UTF-8
KO_KR
en_US.8859-15
en_US.ISO8859-1
en_US.UTF-8
en_US
ko_KR.IBM-eucKR
ko_KR.UTF-8
ko_KR
SQL
복사
# 현재 설정되어 있는 locale 확인
$ locale
LANG=ko_KR.UTF-8
LC_COLLATE=ko_KR.UTF-8
LC_CTYPE=ko_KR.UTF-8
LC_MONETARY=ko_KR.UTF-8
LC_NUMERIC=ko_KR.UTF-8
LC_TIME=ko_KR.UTF-8
LC_MESSAGES=ko_KR.UTF-8
LC_ALL=ko_KR.UTF-8
SQL
복사
TB_NLS_LANG 확인
TB_NLS_LANG는 클라이언트에서 사용하는 캐릭터셋입니다.
지정하지 않을 경우, 데이터베이스의 기본 문자 집합이 사용됩니다.
$ echo $TB_NLS_LANG
UTF8
SQL
복사
대상 테이블 dump 확인
dump 파일을 통해 문자열이 실제로 어떤 바이트 값으로 저장되어 있는지 확인 가능합니다.
SQL> select dump([컬럼명]) from [테이블명];
SQL
복사
사용 예시
SQL> select dump(c2) from t302494;
DUMP(C2)
----------------------------------
NULL
Len=1: 63
Len=1: 63
Len=1: 63
NULL
Len=1: 63
Len=1: 63
NULL
NULL
Len=1: 63
Len=1: 63
Len=1: 63
NULL
NULL
SQL
복사
참고
참고로, Len=1: 63 은 Len=1 → 데이터 길이가 1바이트, 63 → 아스키 코드값 63 을 의미합니다. 내부에서 1바이트를 차지하여 아스키 코드값 63에 해당되는 문자를 저장하고 있다는 의미 입니다.
JDBC 입력 시, 데이터의 캐릭터셋 깨짐 현상 해결 방안
DBC 통해 입력 시 인코딩 문제 발생할 경우, java 컴파일 후 insert 나 update 된 데이터의 캐릭터셋이 깨진다면, 인코딩 설정해서 확인합니다.
$ javac -classpath [jdbc jar 경로] [JAVA 파일명] -encoding utf-8
SQL
복사
예시
--- Tibero 6
$ javac -classpath .:$TB_HOME/client/lib/jar/tibero6-jdbc.jar IMS236665.java -encoding utf-8
--- Tibero 7
$ javac -classpath .:$TB_HOME/client/lib/jar/tibero7-jdbc.jar IMS236665.java -encoding utf-8
SQL
복사
vi 편집기로 입력 후 저장/재오픈 시 인코딩 문제 해결 방안
vi 편집기로 입력 후 저장/재오픈 시에 인코딩 문제가 발생하는데, 터미널이나 LINUX 설정엔 문제가 없을 경우, file encoding을 확인합니다.
$ file -i [파일명]
SQL
복사
예시
$ file -i example.txt
example.txt: text/plain; charset=utf-8
SQL
복사
DB version별 지원하는 charactorset 목록 확인
Character set name는 티베로 캐릭터셋이며, Equivalent Oracle Charset name은 호환 가능한 오라클 기준 캐릭터셋 입니다.
$ tbboot -C
Available character set list
Charset name Equivalent Oracle Charset name
AR8ISO8859P6 AR8ISO8859P6
AR8MSWIN1256 AR8MSWIN1256
ASCII US7ASCII
CL8ISO8859P5 CL8ISO8859P5
CL8KOI8R CL8KOI8R
CL8MSWIN1251 CL8MSWIN1251
EE8ISO8859P2 EE8ISO8859P2
EL8ISO8859P7 EL8ISO8859P7
EL8MSWIN1253 EL8MSWIN1253
EUCKR KO16KSC5601
EUCTW ZHT32EUC
GB18030 ZHS32GB18030
GBK ZHS16GBK
IW8ISO8859P8 IW8ISO8859P8
JA16EUC JA16EUC
JA16EUCTILDE JA16EUCTILDE
JA16SJIS JA16SJIS
JA16SJISTILDE JA16SJISTILDE
MSWIN949 KO16MSWIN949
RU8PC866 RU8PC866
SJIS
SJISTILDE
TH8TISASCII TH8TISASCII
UTF16 AL16UTF16
UTF8 AL32UTF8
VN8VN3 VN8VN3
WE8ISO8859P1 WE8ISO8859P1
WE8ISO8859P15 WE8ISO8859P15
WE8ISO8859P9 WE8ISO8859P9
WE8MSWIN1252 WE8MSWIN1252
ZHT16BIG5 ZHT16BIG5
ZHT16HKSCS ZHT16HKSCS
ZHT16MSWIN950 ZHT16MSWIN950
Available nls_date_lang set list
AMERICAN
BRAZILIAN PORTUGUESE
JAPANESE
KOREAN
RUSSIAN
SIMPLIFIED CHINESE
THAI
TRADITIONAL CHINESE
VIETNAMESE
SQL
복사
참고
운영체제 AIX 이슈로 인해 캐릭터셋이 깨지는 특이 케이스가 있습니다.
AIX에서 DB 캐릭터셋이 euc-tw (대만어)일 경우, jdbc class 파일 수행 시 linux에서는 정상 수행되고 AIX 에서는 캐릭터셋이 깨지는 현상입니다. aix ibm jdk 버그로 인해 euc-tw 인코딩 바이트 변환을 기대했으나 ISO-8859-1 인코딩 되어 깨진 것으로 확인되었습니다.