MSSQL Error) len 함수의 인수 1에 대한 인수 데이터 형식 ntext이(가) 잘못되었습니다.

오류 화면 및 해결 방법

<MSSQL 오류 화면>

Msg 8116, Level 16, State 1, Line 6
len 함수의 인수 1에 대한 인수 데이터 형식 ntext이(가) 잘못되었습니다.

 

결론적으로 말하면, Len() 함수는 'ntext' 데이터 형식에 대해 사용할 수 없다.

ntext 또는 text, image 데이터 형식의 길이를 확인하려면 DATALENGTH() 함수를 사용하여야 한다.


ntext, text, image 데이터 타입이란 것은 뭘까?

테이블을 확인해 보니 데이터 타입이 ntext로 되어 있었다.

<테이블 데이터타입 확인 화면>

 

ntext, text, image 데이터 타입은

대용량의 유니코드 및 비유니코드 문자와 이진 데이터를 저장하기 위한 고정 및 가변 길이 데이터 형식이다.

유니코드 데이터는 Unicode UCs-2(UTF-16) 문자집합을 사용한다.

쉽게 말해, 가변 길이의 데이터를 저장하는 데 사용한다.

  • ntext : 가변 길이의 유니코드 문자열 데이터 저장
  • text : 가변 길이의 아스키 문자열 데이터 저장
  • image : 가변 길이의 이진 데이터 저장

단, 마이크로소프트 공식 문서에 의하면 해당 데이터 타입은 사용을 권장하지 않고,

nvarchar(max) 혹은 varchar(max) 및 varbinary(max)로 대체하여 사용하도록 권장하고 있다.


DATALENGTH 함수에 대하여

DATALENGTH 함수는 사용된 바이트 수를 반환하는 함수이다.

문자 수를 반환하려면 보통 LEN 함수를 사용하지만

ntext, text 데이터 타입은 LEN 함수를 사용할 수 없기 때문에

DATALENGTH 함수를 이용하여 바이트 수로 글자수를 확인하는 것이다.

 

[ ntext ]

  • UTF-16 인코딩의 문자를 사용하기 때문에 보통 한 글자를 2바이트로 취급한다.
  • ntext 타입의 글자수를 구하려면 DATALENGTH 함수의 반환값을 2로 나누면 된다.
-- ntext 글자수 구하기
-- 'col1' 이름을 가진 컬럼은 ntext 데이터타입으로 가정
SELECT
	DATALENGTH(col1) / 2
FROM
	test

 

[ text ]

  • 아스키 코드의 문자를 사용하기 때문에 한 글자를 1바이트로 취급한다.
  • text 타입은 DATALENGTH 함수의 반환값이 글자수이다.
-- text 글자수 구하기
-- 'col2' 이름을 가진 컬럼은 text 데이터타입으로 가정
SELECT
	DATALENGTH(col2)
FROM
	test

 

[ image ]

  • 바이너리 데이터(이진 데이터)를 저장하기 때문에 글자수를 찾는 데 사용하지 않는다.

참고