MSSQL 문자열 길이 구하기 LEN, DATALENGTH 함수

MSSQL 문자열 길이 구하기 LEN, DATALENGTH 함수

개발하다 보면 문자열 길이 구하는 작업, 진짜 지겹도록 마주치죠? 
이때 LEN이랑 DATALENGTH, 뭐가 뭔지 몰라서 삐걱거렸던 경험, 다들 한 번쯤 있을 겁니다. 비슷해 보이는데 은근히 다르고, 잘못 쓰면 데이터 꼬이고, 나중에 잡기 힘든 버그의 씨앗이 됩니다. 이번 포스팅에서 이 두 함수의 개념부터 실전 활용까지 싹 다 파헤쳐 보려고 합니다. 

1. LEN 함수(눈에 보이는 그대로!)

LEN 함수는 문자열의 '문자(Character)' 개수를 반환해 주는 친구입니다. 
우리가 눈으로 보는 문자열 길이, 딱 그만큼을 반환하는 거죠. 
뒤에 붙은 공백 문자들은 카운트 대상에서 가차 없이 제외해 버립니다.

개념 및 정의
문자열 내의 문자(Character) 수를 반환합니다. 
단, 문자열 끝에 있는 공백은 길이에 포함시키지 않습니다.

* 문법
LEN ( string_expression )

* 예제 소스
-- 기본 문자열 길이
SELECT LEN('Hello World'); -- 결과: 11

-- 뒤에 공백이 있는 문자열
SELECT LEN('Hello World '); -- 결과: 11 (뒤 공백 3개는 무시)

-- 앞에 공백이 있는 문자열 (앞 공백은 포함!)
SELECT LEN(' Hello World'); -- 결과: 14

-- 한글 문자열 (한글도 1문자로 취급)
SELECT LEN('안녕하세요'); -- 결과: 5

-- NULL 값
SELECT LEN(NULL); -- 결과: NULL

-- 빈 문자열
SELECT LEN(''); -- 결과: 0

LEN 함수는 주로 이 문자열이 몇 글자로 구성되어 있는지 확인할 때 유용하게 쓰입니다. 
예를 들어, 글자 수 제한이 있는 게시판 제목이나 사용자 이름의 길이를 확인할 때 유용하게 사용됩니다.


2. DATALENGTH 함수 : 속까지 꼼꼼하게!

DATALENGTH 함수는 좀 더 야무진 친구예요. 
얘는 문자열이 실제로 SQL 서버에 저장될 때 차지하는 바이트 크기를 꼬치꼬치 따져 줍니다. LEN함수와는 다르게 뒤에 붙은 공백 문자도 전부 바이트로 계산하고, 한글이나 특수 문자처럼 2바이트 이상을 잡아먹는 친구들도 그 실제 바이트 수만큼 정확히 계산합니다.

개념 및 정의
문자열의 실제 저장 공간을 바이트(Byte) 단위로 반환합니다. 
문자열 끝의 공백도 포함하며, 한글, 한자 등 멀티바이트 문자는 그 실제 바이트 수만큼 길이를 계산합니다. 
데이터 타입과 콜레이션(Collation)에 따라 결과가 달라질 수 있습니다.

* 문법
DATALENGTH ( expression )

* 예제 소스
-- 기본 ASCII 문자열 (VARCHAR)
SELECT DATALENGTH('Hello'); -- 결과: 5 (각 문자 1바이트)

-- 뒤에 공백이 있는 ASCII 문자열 (VARCHAR)
SELECT DATALENGTH('Hello '); -- 결과: 6 (공백도 1바이트로 계산)

-- 한글 문자열 (NVARCHAR - UCS-2 기준)
SELECT DATALENGTH(N'안녕하세요'); -- 결과: 10 (NVARCHAR는 한글 1글자당 2바이트)

-- 한글 문자열 (VARCHAR - UTF-8 콜레이션 가정, 한글 1글자당 3바이트)
-- (실행 환경의 콜레이션에 따라 결과는 달라질 수 있습니다.)
SELECT DATALENGTH('안녕하세요'); -- 결과: 15 (VARCHAR UTF-8 콜레이션일 경우)
-- 만약 'Korean_W_CI_AS'와 같은 구형 콜레이션이면 한글 1글자가 2바이트일 수도 있습니다.

-- NULL 값
SELECT DATALENGTH(NULL); -- 결과: NULL

-- 빈 문자열
SELECT DATALENGTH(''); -- 결과: 0

DATALENGTH는 실제 데이터 저장 공간이나 네트워크 전송 시 필요한 바이트 크기를 측정할 때 핵심적으로 사용됩니다. 
특히 VARCHARNVARCHAR처럼 문자열 저장 방식이 다른 데이터 타입에서 그 차이가 명확해집니다.


3. LEN vs DATALENGTH 언제 뭘 써야 할까?

이 둘의 차이를 명확히 이해해야 쓸데없는 삽질을 막을 수 있습니다.


가장 중요한 포인트

NVARCHAR는 항상 한 글자당 2바이트를 차지합니다. 그래서 `LEN(N'문자열')` 결과에 `* 2`를 하면 DATALENGTH(N'문자열')과 대부분 동일한 값을 얻을 수 있습니다. (서로게이트 쌍은 예외)
VARCHAR는 콜레이션(Collation) 및 문자열 내용에 따라 한 글자당 1~3바이트(UTF-8 기준)를 차지합니다. 그래서 LEN('문자열')만으로는 DATALENGTH('문자열')을 예측하기 어렵습니다.



Q : 근데 LEN 함수가 VARCHAR랑 NVARCHAR 데이터 타입에 따라 결과가 달라지나요?

A : 아니요! LEN 함수는 문자열의 실제 문자 개수를 세는 함수라서, 대상 문자열이 VARCHARNVARCHAR든 상관없이 동일하게 문자 개수를 반환합니다. 
NVARCHAR가 한 글자당 2바이트를 잡아먹더라도, LEN은 그저 1개의 문자로 인식할 뿐이죠. 데이터 타입에 따른 바이트 계산 차이는 오직 DATALENGTH에서 확연히 드러납니다. 
그래서 LEN으로 N'한글' 을 세든 '한글'을 세든 결과는 똑같이 2가 나옵니다.



4. 실무에서의 활용 팁


컬럼 길이 부족 에러

가끔 VARCHAR(10) 으로 컬럼 잡아놓고 ('홍길동 ')공백포함 같은 문자열 넣었더니 데이터 잘리거나 에러 삐빅 나는 경우 있으시죠? '홍길동'은 3글자인데 왜? 싶을 때, DATALENGTH를 써보면 답이 나옵니다. 공백까지 포함해서 10바이트를 넘겨버린 경우가 많거든요. 
데이터 무결성을 지키려면 DATALENGTH는 필수적으로 알아야 합니다.

--컬럼 생성
CREATE TABLE MyData (
MyColumn VARCHAR(10)
);

데이터 삽입시 예상치 못한 문제 발생

INSERT INTO MyData (MyColumn) VALUES ('홍길동 '); 
-- 한글 3글자 + 공백 3개 = DATALENGTH가 9 (UTF-8) 또는 12 (EUC-KR)

만약 한글이 3바이트라면 '홍길동 ' (9바이트) + 3공백 = 12바이트. VARCHAR(10)에 안 들어갑니다.구형 한글 콜레이션이라 2바이트라면 '홍길동' 6바이트 + 3공백 = 9바이트. 이것도 아슬아슬하죠.

삽입 전 DATALENGTH로 미리 체크

SELECT DATALENGTH('홍길동 ');


외부 시스템 연동 시 인코딩 문제

외부 시스템과 데이터를 주고받을 때 인코딩 문제로 길이 삑사리 나는 경우, DATALENGTH가 만능 키예요. 상대방 시스템은 UTF-8로 3바이트 처리하는데 우리 시스템은 EUC-KR로 2바이트 처리하면, 같은 '한' 글자라도 길이에 차이가 생겨 데이터가 잘리거나 깨질 수 있습니다. 
이때 DATALENGTH로 실제 바이트를 비교해 보면 문제가 어디서 삐끗거리는지 바로 파악할 수 있습니다.

NVARCHAR vs VARCHAR 선택의 순간

한글이나 유니코드 문자를 주로 다룬다면 NVARCHAR를 쓰는 게 정신 건강에 이롭습니다. VARCHAR는 콜레이션에 따라 바이트 계산이 복잡해져서 손이 많이 가는 경우가 생깁니다. NVARCHAR는 한글이 항상 2바이트이니 DATALENGTH 예측이 훨씬 쉽죠.

자, 이제 LEN과 DATALENGTH, 언제 써야 할지 감이 좀 잡히셨을 겁니다.
LEN은 겉보기 길이, DATALENGTH는 속 알맹이 길이. 이젠 절대 헷갈리지 마세요. 
상황에 맞춰 똑똑하게 사용하는 것이 진정한 찐 개발자의 덕목 아니겠습니까? 
오늘 배운 내용으로 여러분의 데이터베이스 작업이 훨씬 명확하고 튼튼해지기를 바랍니다!

Comment

다음 이전