저번 SQL 함수 시간에 length 함수를 배웠습니다. 무엇이였는지 기억하시나요? string이 몇 바이트를 차지하는지를 돌려주는 함수였습니다. C언어의 strlen과 같이 말입니다. 그러면, character set이 UTF8이였는데, "조가희"라는 것이 있다면, 어떤 결과가 나올까요? 3이 나오는 게 아니라, 9가 나옵니다. UTF8은, 한글 1글자 당 3byte만큼 차지하기 때문입니다.

 

 

 C언어의 strlen과 속성이 같다고 볼 수 있는데요. 이것도 역시, byte 단위로 리턴을 합니다.

 

 

 실제로 있는 글자의 수가 리턴이 되지 않음을 알 수 있어요. 만약에, "조가희멍멍" 이라는 string을 받았을 때, 글자 수가 리턴이 되었다면 5가 return 되었을 겁니다. 하지만, 5가 아닌 다른 수를 출력했습니다. 이는, strlen이 글자 단위로 안 본다는 소리입니다.

 

 


 문자열의 글자 수를 구해야 할 때가 있습니다. 어떻게 하면 좋을까요?

 

 

 일단, utf8_table과 utf16_table에 'alpa베타' 라는 데이터를 추가해 봅시다.

 

 

 그러면 이 두 테이블에는 다음과 같은 데이터들이 들어가 있을 겁니다.

 

 

 다음 쿼리를 쳐 봅시다. 실행 결과가 어떻게 나올까요?

 

 

 length(stri)는, stri가 차지하는 byte를 구하는 겁니다. UTF8은, 한글은 3byte, 영문은 1byte입니다. 그러면 '조가희'는 3x3 = 9가 나올 겁니다. 그리고, 'cho가hui'는 1x6 + 3x1 = 9가 나올 거고요. 'alpa베타'는 4x1 + 3x2 = 10이 나올 거에요. 그런데, char_length는 글자의 길이를 리턴해 줍니다. 즉, 문자열에 글자가 몇 개 있느냐가 중요합니다.

 

 결과를 보면 알 수 있는데요. char_length('cho가hui')가 7이라는 것을 보면 알 수 있습니다. 여기서 잠깐. 한글이 3byte, 영어가 1byte라고 했는데, 이걸 어떻게 알아낼까요?

 

 

 

 Binary를 봅시다. 그러면 63 68 6f가 나오고, ea b0 80이 나온다는 것을 볼 수 있는데요. 이를 2진수로 끊어보면 아래와 같습니다. e는 14니까 1110, a는 10이니까 1010, b는 11이니까 1011이 나올 거에요. 이를 대략적으로 끊어보면..

 

 

 위와 같이 나오는데요. 정확하게 3byte 짜리 패턴과 똑같습니다. 1byte짜리 패턴은 저렇게 나오지 않습니다. 63, 68, 7f를 잘 보시면, 아래와 같은 패턴임을 알 수 있어요.

 

 

 한글이랑 영어는 요렇게 구분할 수 있다. 정도만 알아두시면 됩니다.

 


 그러면 character set이 UTF16인 경우에도 마찬가지일까요?

 

 

 utf16_table의 character set은 utf16이였습니다. 그렇다면 한글 1개당 2를 차지할 겁니다.

 

 

 그러면 '조가희'의 length는 6, 'cho가hui'는 14, 'alpa베타'는 12가 나올 거에요. 그런데, char_length 함수는 정확하게 글자수를 리턴했음을 알 수 있습니다.