본문 바로가기
DB/MSSQL

[MSSQL: Error] 데이터 형식 varchar을(를) varbinary(으)로 암시적으로 변환할 수 없습니다.

by Dev_Mook 2025. 2. 6.
728x90

# 오류 메시지

 

com.microsoft.sqlserver.jdbc.SQLServerException: 데이터 형식 varchar을(를) varbinary(으)로 암시적으로 변환할 수 없습니다. CONVERT 함수를 사용하여 이 쿼리를 실행하십시오.

 

 

# 오류가 발생한 상황 (예시)

 

  1. 웹 플랫폼에서 사용자 목록을 조회한다.
  2. 검색 조건으로 "거주 지역(country)"을 입력하면 사용자 목록에 거주 여부가 출력된다.
  3. 하지만 "거주 지역(country)"을 입력하지 않고 사용자 목록을 조회하면 "오류 메시지"와 같은
    오류가 발생한다.

 

 

# 사용한 쿼리 (예시)

 

MyBatis

1  SELECT
2  	M.USER_ID,
3	M.USER_NAME,
4	M.BIRTH,
5	M.GENDER,
6	CASE
7		WHEN M.COUNTRY = ISNULL(#{country}, '')
8			THEN '거주'
9		ELSE '비거주'
10	END AS LIVE_YN
11 FROM
12	MEMBER M
13 WHERE
14	...

 

SSMS

1  SELECT
2  	M.USER_ID,
3	M.USER_NAME,
4	M.BIRTH,
5	M.GENDER,
6	CASE
7		WHEN M.COUNTRY = ISNULL(null, '')
8			THEN '거주'
9		ELSE '비거주'
10	END AS LIVE_YN
11 FROM
12	MEMBER M
13 WHERE
14	...

 

 

# 오류가 발생한 원인

 

먼저 오류가 발생한 부분은 MyBatis 7번 째 줄에 작성된 M.COUNTRY = ISNULL(#{coutry}, '')

 

검색 조건인 "거주 지역(country)"을 입력하지 않으면 MyBatis에서 #{country}에 null 값이 전달되요.

이 때 MyBatis는 내부적으로 비교하는 컬럼(M.COUNTRY)과 데이터타입을 일치시키기 위해 형변환을 하는데,

null은 MyBatis에서 varbinary 타입으로 인식해요.

 

오류 메시지를 읽어보면 M.COUNTRY 컬럼이 varchar 타입인데

이 컬럼을 null의 데이터타입인 varbinary로 변경하려다 에러가 발생했다는 것을 알 수 있어요.

 

하지만 SSMS에서 쿼리를 실행하면 정상 동작 합니다.

 

결론!

MyBatis에서 ISNULL(#{country}, '')을 사용하여 데이터를 조회/수정/삭제하는 과정에서

오류가 발생할 수 있다는 거에요.

 

 

# 해결 방법

 

결국 오류의 원인은 MyBatis를 이용하여 M.COUNTRY = ISNULL(#{country}, '') 형식으로

쿼리를 작성했다는 것이에요.

 

이 오류를 해결하기 위해 몇 가지 방법이 있는데요.

  1. 검색 조건인 "거주 지역(country)"를 입력하지 않았을 때 Front-end에서 null 대신
    빈 값의 문자열로 전달해주기

  2. Back-end에서 country 값이 null인 경우 빈 값의 문자열로 변경하기

  3. MyBatis에서 조건문을 이용하여 쿼리를 작성하기
    <if test="country != null"> ... </if>
    <if test="country = null"> ... </if>

어떤 방법을 사용하던 오류는 해결할 수 있어요.

참고로 저는 Back-end에서 빈 값의 문자열로 변경하여 MyBatis에 전달하는 것을 선호한답니다.

728x90