[SQL] SQL Server "문자열이나 이진 데이터는 잘립니다." 문제의 원인과 해결 방법 - varchar와 nvarchar의 차이와 문자열 길이 얻기

SQL Server 테이블에 데이터를 저장하다 보면 빈번하게 마주치는 메시지 중의 하나가 "문자열이나 이진 데이터는 잘립니다." 입니다.

결론부터 말하면 컬럼 길이보다 긴 문자열 데이터를 저장하려고 시도할 때 발생하는 에러 메시지입니다.

영문 환경에서 사용할 때는 "String or binary data would be truncated" 라는 메시지가 표시됩니다.

당연하지만, 컬럼 길이를 늘려주거나, 저장하려는 문자열을 전처리 해서 컬럼 길이보다 작거나 같게해야 합니다.

varchar 데이터 타입의 이해

varchar는 바이트 단위의 데이터를 저장합니다.

varchar(10)은 최대 10바이트 길이 문자열을 저장할 수 있고, 한글만으로 저장하면 최대 50자를 저장할 수 있습니다.

다음과 같은 테이블에 

create table delivery(
    address varchar(10)
)

새 행을 저장하면 

insert into delivery (address) values ('한글 주소 저장');

"문자열이나 이진 데이터는 잘립니다" 에러가 발생합니다.

문자열 길이를 얻는 함수로 문자열의 길이를 확인하면 8이 됩니다.

select LEN('한글 주소 저장');

같은 문자열의 바이트 길이를 확인해보면 14가 나옵니다. 따라서 varchar(10)에는 저장할 수 없습니다.

이 문제를 해결하는 방법은 다음 2가지가 있습니다.

nvarchar로 컬럼 문자열 타입을 지정

다음과 같이 nvarchar로 컬럼 타입을 지정하면 UTF-8로 문자열이 저장되며, 최대 한글 10자를 저장할 수 있습니다.

문자 길이에 무관하게 1글자는 1개로 카운트됩니다.

create table delivery(
    address nvarchar(10)
)

전처리로 문자열 길이 자르기

저장할 문자열을 전처리를 해서 컬럼 길이보다 작거나 같게 자릅니다.

insert into delivery (address) values (SUBSTRING(CONVERT(TEXT,'한글 주소 저장'),1,10));

CONVERT(TEXT,'문자열') 함수는 문자열을 바이트 데이터로 변환하는 방법입니다. 바이트 데이터로 변환한 문자열을 10바이트를 자르는(SUBSTRING()) 것입니다.