[SQL] 문자열 길이와 문자열 자르기 - 바이트 단위 문자열 길이와 바이트 단위 문자열 자르기

SQL에도 일반 프로그래밍 언어처럼 문자열의 길이 값을 얻거나 문자열의 일부만을 가져오는 함수들이 있습니다.
DB에서 미리 가공된 값을 가져올 수 있으면, 개발단에서의 후처리가 간편해지기 때문에 최대한 필요로 하는 결과 값에 가까운 데이터를 얻는 것은 SQL에서 중요합니다.

전체적인 서버단의 실행 시간 단축에도 도움이 됩니다.
DB에서 얻은 문자열을 서버 코드에서 후처리로 가공해서 결과를 출력하는 것보다, DB에서 미리 가공된 문자열을 그대로 출력하는 방식이 리소스도 덜 먹고 실행시간도 더 짧습니다.

DB 종류마다 함수 이름이 조금씩 다르기 때문에 구분해서 사용해야 합니다.

문자열 길이를 얻는 함수

문자 1개는 길이 1이 됩니다. 영문, 공백, 대소문자, 한글 및 2바이트 이상 문자 모두 1자가 길이 1이 됩니다.

DB 함수 "I love you" "라이언"
MySQL CHAR_LENGTH(string)
CHARACTER_LENGTH(string)
10 3
MSSQL LEN(string) 10 3
Oracle LENGTH(string) 10 3

문자열 바이트 길이를 얻는 함수

한글과 같은 2바이트 이상 문자의 길이 값은 DB에 따라 결과값이 다를 수 있습니다.
예상과는 전혀 다른 길이 값이 출력될 수 있으므로 사용할 때 주의해야 합니다.

MySQL과 오라클은 한글 1글자가 3바이트가 되며, MSSQL은 한글 1글자가 2바이트가 됩니다.
MySQL과 오라클은 한글 인코딩 설정에 따라 한글 한글자 길이가 다릅니다. EUC-KR은 2바이트 UTF-8은 3바이트입니다.

UTF-8 인코딩을 기준으로 합니다.

DB 함수 "I love you" "라이언"
MySQL LENGTH(string) 10 9
MSSQL DATALENGTH(string) 10 6
Oracle VSIZE(string)
LENGTHB(string) - 싱글바이트 LOB만
10 9



문자열 자르기

한글 및 2바이트 문자 1글자도 길이 1로 처리합니다.
자르는 문자열의 시작위치(start)는 모든 DB 공통으로 1에서 시작합니다. 개발언어에서 말하는 0에서 시작하는 인덱스와는 다릅니다.
길이(length) 파라메터는 생략할 수 있으며, 생략하면 시작위치(position)부터 문자열 끝까지 반환합니다.
시작위치(position)는 음수값을 사용할 수 있으며, 음수가 되면 왼쪽 방향으로 절대값만큼 이동한 위치가 시작위치가 됩니다.

DB 함수 사용법
MySQL SUBSTRING(string, position, length) SUBSTRING('I love you',1,5) -> "I lov"
SUBSTRING('아이 러브 유',1,5) -> "아이 러브"
SUBSTRING('아이 러브 유',1,15) -> "아이 러브 유"
MSSQL SUBSTRING(string, position, length) SUBSTRING('I love you',1,5) -> "I lov"
SUBSTRING('아이 러브 유',1,5) -> "아이 러브"
SUBSTRING('아이 러브 유',1,15) -> "아이 러브 유"
Oracle SUBSTR(string, position, length) SUBSTR('I love you',1,5) -> "I lov"
SUBSTR('아이 러브 유',1,5) -> "아이 러브"
SUBSTR('아이 러브 유',1,15) -> "아이 러브 유"



바이트 단위로 문자열 자르기

DB에 따라 한글 및 2바이트 이상 문자 길이가 다르므로 자르기를 할 때 주의해야 하며, DB에 따라서는 문자열을 바이트 문자 타입으로 변경한 후 문자열 자르기로 잘라야 합니다.
UTF-8 인코딩을 기준으로 합니다.
MySQL의 경우, 한글 문자열을 바이너리 데이터로 변환해 자른 후, 다시 UTF-8로 변환하는 2단계를 거쳐야 합니다.

바이트 단위로 2바이트 이상 문자 데이터를 자를 때는 DB에 따라서는 원하는 위치에서 정확하게 문자열이 잘리지 않을 수 있습니다.

DB 함수 사용법
MySQL CONVERT(SUBSTRING(CONVERT(string USING binary),1,6) using utf8)
CONVERT(SUBSTRING(CONVERT('아이 러브 유' USING binary),1,6) using utf8) -> "I love"
CONVERT(SUBSTRING(CONVERT('아이 러브 유' USING binary),1,6) using utf8) -> "아이"
MSSQL SUBSTRING(CONVERT(TEXT,string), position, length) SUBSTRING(CONVERT(TEXT,'I love you'),1,5) -> "I lov"
SUBSTRING(CONVERT(TEXT,'아이 러브 유'),6,4) -> "러브"
SUBSTRING(CONVERT(TEXT,'아이 러브 유'),1,15) -> "아이 러브 유"
Oracle SUBSTRB(string, position, length) SUBSTRB('I love you',1,5) -> "I lov"
SUBSTRB('아이 러브 유',8,6) -> "러브"
SUBSTRB('아이 러브 유',1,14) -> "아이 러브 "