Almost-Native

Oracle 유니코드 지원, UTF-8, UTF-16, UCS-2 인코딩 차이, 캐릭터셋 본문

Java 프로그램 개발, IT

Oracle 유니코드 지원, UTF-8, UTF-16, UCS-2 인코딩 차이, 캐릭터셋

2020. 12. 11. 23:00

유니코드(Unicode)는 전세계 언어를 코드로 표현하기 위해 유니코드 콘소시엄(http://www.unicode.org)에서 관리되고 있습니다.

이 콘소시엄에서 가급적 많은 언어를 포함시키면서 버전을 관리하고 있습니다.

Unicode 1.0 -> Unicode 2.0 -> Unicode 3.0 -> Unicode 4.0 -> ....

 

유니코드는 문자에 부여된 숫자코드입니다.

영어문자 'A' 의 유니코드는 0x41(십진수 65) 이고,

한글문자 '한' 의 유니코드는 0xED959C (십진수 15570332) 입니다.

영어로는 1 바이트만 있으면 되는데, 한글은 3 바이트가 필요합니다.

 

이런 차이때문에 얘네들을 모두 같은 크기로 저장할 것인지, 서로 다른 크기로 저장할 것인지에 따라 인코딩(Encoding) 방식이 여러가지가 나오게 되었습니다.

 

모두 같은 크기로 저장하는 방식이 UCS-2 이고,

가변크기로 저장하는 방식이 UTF-8UTF-16 입니다.

 

(출처 : docs.oracle.com)

UCS-2 인코딩 방식은 한글이고, 영문이고 모두 2 바이트에 때려넣는 방식입니다.

윈도우즈, Java 에서 이 방식을 사용합니다.

 

UTF-16 인코딩 방식은 UCS-2 의 확장버전입니다.

UCS-2 처럼 2 바이트에 저장하는데, 일부 특수문자들 .. Supplementary Characters 라고 하는데... 

이 안에는 요런 😒👌🤷‍♂️💋  이미지들도 문자로 들어가 있습니다.

Supplementary Characters 들에 대한 전체 코드를 보려면 아래 URL을 참조하세요

    ▶ 참조)  https://design215.com/toolbox/utf8-4byte-characters.php

 

UTF-8 인코딩 방식가변길이 인코딩 방식입니다.

알파벳의 경우에는 1 바이트에 저장하고, 유럽문자들이 2 바이트, 한글의 경우에는 3 바이트를 사용합니다.

그리고, 위에서 언급한 Supplementary Characters 들은 4 바이트를 사용해서 저장하는 방식입니다.

UTF-8 인코딩 방식은 UNIX 시스템, HTML, 브라우저 등에서 주로 사용됩니다.

 

위 SQL문을 실행한 DB는 AL32UTF-8 인코딩을 사용하고 있는데,

영어문자 'A' 는 1 바이트로 나오고, Supplementary Character '😁' 는 4 바이트로 나오는 것을 확인할 수 있습니다.

 

 

오라클은 UTF-8 인코딩방식을 지원하는 캐릭터셋(Character Set)으로 UTF8AL32UTF8 이 있습니다.

UTF8 과 AL32UTF8 의 차이는 4바이트짜리 Supplementary Characters 을 지원하는 지의 차이입니다.

 

자신의 DB가 어떤 캐릭터셋을 사용하는 지는 아래와 같이 조회할 수 있습니다.

 

SQL> select sys_context('userenv', 'language') from dual;

SYS_CONTEXT('USERENV','LANGUAGE')
----------------------------------------------------------------------------------------------------
AMERICAN_AMERICA.AL32UTF8

 

Comments