본문 바로가기

IT/오라클

[Oracle] 오라클 알쏭달쏭 NVARCHAR2 도데체 몇자까지 들어가는건지..

반응형
일반적인 설명들은 인터넷 뒤져보면 참 많습니다..

가변형문자열을 저장할때 사용하고
유니코드문자 지원을 위해 사용하며
nvarchar2는 varchar2보다 동일 데이터 저장시 공간을 2배 사용하며
한글이 3바이트씩 잡히네 어쩌네...하는둥...
한글이건 영문이건 한글자로 인식하네 어쩌네....

이런 설명만으로는 이해가 안가서 직접 삽질을 시도했습니다.

일단 테이블을 생성한 후 타입을 nvarchar2(2000)으로  가지는 필드를 하나 만들어줬습니다.

(4000)이 안먹더군요. 아마도 동일 데이터 저장시 공간을 2배 사용하며 .. 이런 구문때문이 아닐까 싶었습니다.

그러고는 무작정 insert 쿼리를 만들어 실행을 해댔지요.
일단 한글 500자 넣어봤습니다. 들어갑니다.

1000 자 넣어봣습니다. 들어값니다.
2000 자 안들어갑니다.

1000자 ~에서 2000자 사이겠구나 하고 맞춰봤습니다.
그랬더니 한글1333자 + 영문1글자 까지 들어가더군요...  엥..뭐냐 이 애메한 숫자는

한글글자수에에 *2  하면 2667이 나옵니다. 
엥.. 아까 타입길이를 2000바이트 로 잡았는데.  2667 바이트가 들어가다니...ㅡㅡ;

한글이 3바이트씩 잡히네.. 하는 내용이 있어 한글*3 해봣습니다.
3999 + 아까 넣었던 영문 1글자 = 4000 딱 떨어지네요.. 동일 데이터 저장시 공간을 2배 사용하며 란 말과 뭔가 연관있는듯 한데요... 어찌보면 표시가 2/1로 되는거 아닌가도 싶고..

이번에는 영문만 넣어봤습니다. 딱 2000 자 들어가네요  헐... 동일 데이터 저장시 공간을 2배 사용하며 란 말은 아마도 이런경우를 두고 하는 말인가보네요... 실제공간은 4000바이트를 사용하는데 영문 2000자 만 들어가니 말이죠..

그럼 이번엔 섞어서 넣어봤습니다.

영문 1000자 + 한글 1000자  들어갑니다. 딱 4000바이트네요... 거기서 한글자도 더 추가 안됩니다.
 
이번엔
영문 1001자 + 한글 999자  들어갑니다. 바이트로 계산하면 3998 바이트이구요. 바이트 채워볼라고 영문 한글자 더넣어봤습니다.

영문 1002자 + 한글 999자   안들어가요.. 헐... 한글 998 자로 넣어보니 들어갑니다.

결론났네요.. nvarchar2(2000) 타입에 들어가는 문자열의 바이트 는 한글3바이트, 영문 1바이트씩  4000 바이트를 계산하여 들어가지만 영문이건 한글이건 글자수는 2000자가 넘지 않는다.

문자열 앞에 N 을 붙여서 테스트를 해봤습니다.  결과는 더 간단하더군요..

유니코드 문자열은 영문 한글 안가리고 무조건 2000자까지 들어감...ㅡㅡ;

모든 경우를 테스트해본건 아니어서 예외의 경우가 발생할 수는 있을겁니다.
이건 뭐 실험도 아니고 ..

이제  내머리로 이해할 수 있는수준으로 편하게 정리가 되네요..ㅋ

혹 제가 잘못알고 있는거라면 그냥 가시지 말구 태글 꼭 부탁드려요...
반응형