[SQL Server]JAVA(JDBC)+MS-SQL로 프로젝트를 진행한다면?(sendStringParametersAsUnicode)

Updated:

※ 올해 JAVA + MS SQL SERVER 구축 프로젝트에서 똑같은 상황이 3번이나 발생하여 글을 작성한다.

인덱스는 VARCHAR 컬럼으로 되어있는데, NVARCHAR로 파라미터가 호출 되면 어떻게 될까?

이럴경우 자료형의 우선순위로 인하여,

NVARCHAR는 변함없이 VARCHAR컬럼이 형변환되는데, 인덱스가 VARCHAR형이면 형변환으로 인하여

인덱스를 타지 못한다.

SQL SERVER의 DMV를 활용하여 위와같이 쿼리를 조회하면 SQL_TEXT의 결과를 확인할 수 있다.

@P0부터 nvarchar(4000)의 형태로 파라미터의 자료형이 선언된 것을 확인 할 수있다.

테이블 컬럼의 자료형을 처음 설계부터 varchar로 선언하였는데, 파라미터가 nvarchar로 넘어오는 상황이다.

위에서 말했지만 이런 경우는 인덱스를 타지 못한다.

극단적으로는 varchar로 선언된 컬럼 인덱스는 모두 올바르게 활용하지 못한다.##

MS SQL SERVER에 JDBC를 사용시,

이럴경우에는 JDBC URL의sendStringParametersAsUnicode=false

확인이 필요하다.

JDBC는 기본적으로 NVARCHAR로 매핑하려 하기 때문에 아래와 같이 URL에 추가해야한다.

datasource:

type: org.apache.tomcat.jdbc.pool.DataSource

driverClassName: com.microsoft.sqlserver.jdbc.SQLServerDriver

url: jdbc:sqlserver://rubyhost:6436;database=SbSvc;sendStringParametersAsUnicode=false

이렇게 적용후에는 아래와 같이 varchar로 바뀌는것을 확인 할 수 있다.

[결과]

이제 varchar컬럼의 인덱스를 올바로 사용할 수 있게 되었다.

여기서 잠깐!

그렇다면 실제로 nvarchar형의 인덱스에 varchar 파라미터의 경우는 어떻게 될까?

이런 경우는 nvarchar와 varchar의 우선순위로 인하여 varchar 파라미터가 Nvarchar로 형변환 되기 때문에

인덱스를 활용하는데 문제가 되지 않는다.