테이블 설계할 때,
저는 내용에 한글이 포함되면 nvarchar로
영어 숫자로 이루어진 내용이라면 varchar로 사용합니다.
언제부터가 이런 선입견이 생겨서 해당 내용으로 테이블 설계를 했는데.
아시는 개발자는 그냥 웬만하면 다 varchar로 설계하신다고 하네요.
영어 숫자는 1byte. 한글은 2byte를 차지해서 제가 저렇게 한거 같은데, 제가 틀린건가요?
저도 문자는거의 VARCHAR로 설계하긴하는데. 그렇다고 NVARCHAR도 틀린것은 아니지요.
오라클 경우는 JOIN 시 DATA TYPE이 틀리면 문제 (INIDEX 활용)있을수 있다고 본적은 있습니다.
그런데 NVARCHAR는 문자당 전부 2BYTE아닌가요?
답변주신 것을 풀이 한다면.
NVARCHAR일 경우.
'a' = 2Byte.
'김' = 2Byte 크기로 저장된다는 말씀이신건가요?
사실 정확하게 어떤 경우에 사용해야 하는지 잘 모르고 사용하고 있어서
정확하게 알고싶어서 질문을 남겼습니다.
오라클로 체크하면
SELECT LENGTHB('11') FROM DUAL -> 2BYTE
SELECT LENGTHB(N'11') FROM DUAL -> 4BYTE
로 나옵니다.
테이블에 직접 넣고 테스트하지는 못했습니다.
제가 아는 범위에서,, 과거에는, DB charterset 이 유니코드 지원을 못하는 경우
- 타 DB 와의 연동,, 전사표준 등 사유로,,, NLS CHARTERSET 이 만약 KO16MSWIN949 로 설정했다면
한글을 2 byte 로 처리하면서 varchar2() 같은 경우,, order by 만으로 한글정렬을 할 때 문제가 생기거나, 다국어를 입력할 수 없는 문제등이 발생됩니다.
이런 경우에, 이를 보완하기 위해서, Oracle 은 2번째 Charterset 인 national Charterset 을 지정할 수 있고, n 이 붙은 데이터 타입 ( ex nchar() ,, ) 을 사용하면 2번재 캐릭터셋인 national charterset 을 통해, 지원하지 어려운 데이터를 처리할 수 있게 했습니다.
- 보통은 UTF8 혹은,, AL16UTF8, AL32UTF8 등으로 지정
....... 과거에는요...
지금은 DB Charterset 을 대부분 유니코드 지원되는 UTF8 등으로 지정한 지 ,,, 꽤 되었고, 따라서 다국어를 지원해야 하는 글로벌 회사들도 national charterset 사용이 거의 없다고 알고 있습니다.
기본 NLS Charterset 만으로 한글 처리 등에 문제가 없다면,, N타입은 사용하지 않아도 될 것 같습니다.
아는 범위 내에서 답변해주셔서 고맙습니다.
MSSQL 상위 버전에서 NVARCHAR가 그래도 남아있는 거보면,
그래도 VARCHAR와의 다른 부분이 있지 않을까 싶습니다.
조금 더 찾아봐야겠습니다. 다시 한번 고맙습니다.
설명할 수 있을 만큼, 제가 잘 모르는 것 같아서, 아래 검색 결과를 남깁니다.
- https://rastalion.me/oracle-character-set-%EC%97%90-%EA%B4%80%ED%95%98%EC%97%AC/
NVARCHAR 유용점이라면 VARCHAR(4000)에 인코딩이 UTF계열이라면 한자당 3BYTE가 차지하는데
1333자 정도만이 가능합니다. 간혹 이런경우 CLOB으로만 TYPE을 바꾸어야 하는데
NVARCHAR라면 좀 더 넉넉히 슬수 있으니 그냥 쓸수있는 경우가 있을수 있네요.