[Oracle/Java] 한글 몇 Byte지? 비교 LENGTHB(), VSIZE(), LENGTH() length(), getBytes("EUC-KR").length getBytes("UTF-8").length NLS_CHARACTERSET : KO16MSWIN949
한글이 몇바이트지? 해서 찾아보다가 다음 정보를 확인할 수 있었다.
인코딩 설정에 따라서 한 글자당 바이트수가 달라지는 걸 확인하고서 찾아봤다. 일단 오라클 DB에서는 이렇게 세팅되어 있으니, 이걸 기준으로 확인하면 될 것 같다.
NLS_CHARACTERSET : KO16MSWIN949
* KO16KSC5601, KO16MSWIN949, EUR-KR : 한글 한 글자 2바이트
* UTF8, AL32UTF8 : 한 글자 3바이트
그래서 실재 등록된 데이터의 크기를 확인해본다.
먼저 ORACLE DB 에서...
SELECT LENGTHB(THIS_NM), THIS_NM FROM TB_THIS
WHERE THIS_ID = 'JASON LEE';
LENGTHB(THIS_NM) THIS_NM
-------------------------------- ----------------
6 이재수
SELECT VSIZE(THIS_NM), THIS_NM FROM TB_THIS
WHERE THIS_ID = 'JASON LEE';
VSIZE(THIS_NM) THIS_NM
-------------------------------- ----------------
6 이재수
SELECT LENGTH(THIS_NM), THIS_NM FROM TB_THIS
WHERE THIS_ID = 'JASON LEE';
LENGTH(THIS_NM) THIS_NM
-------------------------------- ----------------
3 이재수
각각 컬럼의 한글 길이를 구별할 수 있다. 그래서 제대로 파악해서 비교해야 할 것이다.
JAVA에서는 어떻게 비교할 수 있을까?
outputVo.thisNm.length();
=> 3
outputVo.thisNm.getBytes("EUC-KR").length;
=> 6
outputVo.thisNm.getBytes("UTF-8").length;
=> 9
각각 길이가 다르게 표시되는 걸 확인할 수 있었다. 그래서 한글 사용할 때는 기준을 잘 적용해서 확인해야 하는 것이겠다. 단순히 몇 글자인지를 체크하려면 length()로 확인할 수 있고, 캐릭터셋으로 구분해서 길이를 확인하려면 getBytes("EUC-KR").length, getBytes("UTF-8").length 를 사용해서 구별할 수 있다.
SELECT * FROM NLS_DATABASE_PARAMETERS;
PARAMETER VALUE
----------------------------------- ------------------
NLS RDBMS VERSION : 19.0.0.0.0
NLS_NCHAR CONV EXCP : FALSE
NLS_LENGTH_SEMANTICS : BYTE
NLS_COMP : BINARY
NLS_DUAL_CURRENCY : $
NLS_TIMESTAMP_TZ_FORMAT : DD-MON-RR HH.MISSXFF AM TZR
NLS_TIME_TZ_FORMAT : HH.MI.SSXFF AM TZR
NLS TIMESTAMP_FORMAT : DD-MON-RR HH.MI.SSXFF AM
NLS_TIME_FORMAT : HH.MI.SSXFF AM
NLS_SORT : BINARY
NLS_DATE_LANGUAGE : AMERICAN
NLS_DATE_FORMAT : DD-MON-RR
NLS_CALENDAR : GREGORIAN
NLS_NUMERIC_CHARACTERS : .,
NLS_NCHAR_CHARACTERSET : AL16UTF16
NLS_CHARACTERSET : KO16MSWIN949
NLS_ISO_CURRENCY : AMERICA
NLS_CURRENCY : $
NLS_TERRITORY : AMERICA
NLS_LANGUAGE : AMERICAN