일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- authorizeUrls
- springsecurity
- 알고리즘 #자료구조 #리스트 #스택 #큐 #트리
- ruby
- 자바
- AuthenticationManagerBuilder
- MySQL
- Java
- minitest
- authorizeRequests
- 파이썬 #기타제어흐름도구 #제어문 #함수 #FOR문
- 알고리즘
- 프로그래머스
- WebSecurityConfigurerAdapter
- Rails
- 파이썬 #자료형 #python
- 루비
- Spring
- character_set
- Ruby on Rails
- ruby-prof
- configureGlobal
- 스프링시큐리티
- 개발자
- 알고리즘 #프로그래머스 #K번째수 #자바 #JAVA #정렬알고리즘 #정렬
- authorizeUrls missing
- 정적리소스
- python manage.py migrate
- 정렬
- 스프링
- Today
- Total
손만이의 개발노트
[MSSQL]데이터 형식 varchar을(를) varbinary(으)로 암시적으로 변환할 수 없습니다. XML에서 ISNULL이 안된다, XML은 NULL을 인식하지 못한다? 본문
[MSSQL]데이터 형식 varchar을(를) varbinary(으)로 암시적으로 변환할 수 없습니다. XML에서 ISNULL이 안된다, XML은 NULL을 인식하지 못한다?
sonman 2019. 1. 16. 21:50"데이터 형식 varchar을(를) varbinary(으)로 암시적으로 변환할 수 없습니다. " 란
오류에 대해 다룹니다.
위 와 같은 오류는 varchar타입에 binary형식의 데이터를 넣은 경우 발생합니다.
일단 오류가 발생하게 된 부분은 MYBATIS환경에 XML에서 작성된 소스에서 발생하였으며
1 2 3 | DECLARE @WAIT_DIV_CD NVARCHAR(5) SET @WAIT_DIV_CD = ISNULL(#{WAIT_DIV_CD },'') | cs |
란 소스 코드 였습니다.
해당 쿼리를 SSMS(SQL Server Management Studio)에서 실행하게 되는 경우 문제가 없으나
어플리케이션에서 XML을 통해서 실행하게 되는 경우 위와 같은 에러가 발생합니다.
위 와 같은 차이는 XML과 MSSQL에서 NULL이란 데이터를 대해 다르게 다룬다는 점에서 발생한다.
IBM공식사이트에서 다루는 XML에서의 NULL에 대한 처리는 NULL값을 NULL로 다루지 못한다는 겁니다.
즉 MSSQL에서는 NULL이란 문자를 NULL로 인식해 ISNULL() 함수가 적용되면서 NULL이 아닌
대체할 문자('')로 반환을 하여 에러가 발생하지 않았지만
XML에서는 NULL을 인식하지 못하여 대체하는 문자('')가 아닌 NULL이라는 모양의 바이너리 데이터가
입력되어 에러가 발생하게 됩니다.
* 해결방법
1. 변수의 NULL처리를 XML에 전달되기 전에 처리한다.
: 다음과 같은 방법은 XML에게 전달되기 전의 프로그램 에서 NULL처리를 하여 NULL이란 데이터를 없앱니다.
2. ISNULL을 DB에서 한다.
: MSSQL을 예로 들면 해당코드가 XML에서 전부 처리하는게 아닌
1 2 3 4 5 | DECLARE @WAIT_DIV_CD NVARCHAR(5) SET @WAIT_DIV_CD = #{WAIT_DIV_CD } EXEC SP_PROCEDURE_START @WAIT_DIV_CD | cs |
와 같은 방식으로 프로시져를 호출하는 형태면 프로시저 내에서 ISNULL() 함수를 써서 NULL을 제거하여도 된다.
3. MYBATIS구문 사용
: MYBATIS의 IF구문을 사용하여 NULL처리를 진행한다.
1 2 3 4 5 6 7 8 9 10 | DECLARE @WAIT_DIV_CD NVARCHAR(5) <if test='WAIT_DIV_CD == null '> SET @WAIT_DIV_CD = #{WAIT_DIV_CD } </if> <if test='WAIT_DIV_CD != null '> SET @WAIT_DIV_CD = '' </if> EXEC SP_PROCEDURE_START @WAIT_DIV_CD | cs |
이 와 같이 XML에서 NULL로 인해 형변환 에러가 발생하는 경우 3가지 방식으로 처리를 해주시면 됩니다.
'데이터베이스' 카테고리의 다른 글
[Mysql] information_schema 로 character_set 검색 (0) | 2020.04.09 |
---|---|
아주 간단한 쿼리 작성 팁 - 인덱스 활용편 (0) | 2020.04.02 |