반응형
오류 화면 및 해결 방법
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 ]
- 바이너리 데이터(이진 데이터)를 저장하기 때문에 글자수를 찾는 데 사용하지 않는다.
참고
반응형