CUBRID 9.x 버전에서 DB 생성 시의 문자셋과 테이블 또는 컬럼에서 지정한 문자셋이 다를 때, 데이터 출력시 깨져서 보이는 경우가 있다.
환경] DB COLLATE를 en_US, 문자셋은 iso88591로 생성 및 UTF8 문자셋의 테이블 생성.
$ cubrid createdb tmp en_US Creating database with 512.0M size using locale en_US. The total amount of disk space needed is 1.5G. CUBRID 9.2 $ csql -u dba -S tmp CUBRID SQL Interpreter Type `;help' for help messages. csql> select charset(''); === <Result of SELECT Command in Line 1> === charset('') ====================== 'iso88591' 1 rows selected. (0.011982 sec) Committed. 1 command(s) successfully processed. csql> create table tmp(col1 int auto_increment, col2 varchar(5) COLLATE utf8_bin) COLLATE utf8_ko_cs; Execute OK. (0.001303 sec) Committed. 1 command(s) successfully processed. |
일반적인 INSERT 문을 사용하여 데이터를 입력하면 데이터가 깨져서 보인다.
예1] csql> insert into tmp(col2) values('가'); 1 row affected. (0.009916 sec) Committed. 1 command(s) successfully processed. csql> select * from tmp; === <Result of SELECT Command in Line 1> === col1 col2 =================================== 1 'ê°?' 1 rows selected. (0.019385 sec) Committed. 1 command(s) successfully processed. |
위와 같은 경우에는 데이터 입력 시, 따로 지정된 문자셋이 없어 DB 생성시의 문자셋인 iso8859-1로 데이터가 입력되어 발생한다.
해당 문제는 아래와 같은 2가지 방법으로 UTF8 데이터를 입력할 수 있다.
1. 문자셋 소개자 사용 : INSERT INTO TABLE_NAME(COL2) VALUES(_UTF8'큐브리드');
예2] csql> insert into tmp(col2) values(_utf8'나'); 1 row affected. (0.000220 sec) Committed. 1 command(s) successfully processed. csql> select * from tmp; === <Result of SELECT Command in Line 1> === col1 col2 =================================== 1 'ê°?' 2 '나' 2 rows selected. (0.011894 sec) Committed. 1 command(s) successfully processed.
|
2. 문자셋을 명시 : SET NAMES UTF8;
INSERT INTO TABLE_NAME(COL2) VALUES('큐브리드');
예3] csql> set names utf8; Execute OK. (0.000025 sec) Committed. 1 command(s) successfully processed. csql> insert into tmp(col2) values('다'); 1 row affected. (0.000282 sec) Committed. 1 command(s) successfully processed. csql> select * from tmp; === <Result of SELECT Command in Line 1> === col1 col2 =================================== 1 'ê°?' 2 '나' 3 '다' 3 rows selected. (0.011805 sec) Committed. 1 command(s) successfully processed. |
문자셋과 콜레이션은 다음과 같은 우선 순위를 같는다.
1. 문자셋 소개자(또는 문자열의 COLLATE 수정자)
2. SET NAMES문으로 명시한 문자셋과 콜레이션
3. 시스템 문자셋과 콜레이션(DB 생성 시 지정한 로캘에 의한 기본 콜레이션)
예제1에서는 위 우선 순위 중 1, 2번으로 명시된 문자셋이 없었으니 데이터 입력 시 '3번 시스템 문자셋과 콜레이션'을 사용하였기 때문에 이후 결과물 출력 시 데이터가 깨져보이는 현상이 발생했었던 것이다.
예제 2와 예제 3에서는 위 우선 순위에 해당하는 1, 2번이 각각 사용되어 테이블 문자셋과 동일한 문자셋으로 데이터를 입력하였기 때문에 이후 결과물 출력 시 데이터를 정상적으로 확인할 수 있는 것이다.
메뉴얼 : 문자열 리터럴의 문자셋과 콜레이션