본문 바로가기
프로그래밍/JAVA

[JAVA] MSSQL를 연동하여 MyBatis를 사용할 때 String 파라미터 데이터 타입

by 소나기_레드 2025. 2. 19.

프로그램에서 JDBC 를 사용하여 MSSQL 연동하고, MyBatis를 사용하는 경우, MyBatis로 파라미터를 전달할때,

MSSQL JDBC 드라이버는 String 타입의 파라미터를 기본적으로 NVARCHAR 로 매핑한다.

 

VARCHAR 타입의 인덱스가 있을 경우, NVARCHAR로 매핑되면 인덱스를 제대로 참조하지 못하는 경우가 있다.

이 경우, DB Lock 이 발생하거나, CPU를 많이 사용하는 쿼리가 발생할 수 있다.

 

String 타입 파라미터를 NVARCHAR 타입이 아닌, VARCHAR 타입으로 전달하려면

1. JDBC URL 에 sendStringParametersAsUnicode=false 를 추가하면, 기본으로 VARCHAR 타입으로 매핑된다.

2. 쿼리 파라미터에 타입을 정해 주거나, 상수로 전달하는 방법도 있다.

    2.1 SELECT * FROM 테이블명 WITH(NOLOCK)

          WHERE A = #{필드명, jdbcType = VARCHAR};

    2.2 SELECT * FROM 테이블명 WITH(NOLOCK)

          WHERE A = ${필드명}

 

1번 방법을 사용할때, 기존에 암호화하여 저장된 경우, NVARCHAR로 전달되어 암호화한 데이터와, VARCHAR 로 전달되어 암호화한 데이터가 서로 다르므로 운영 적용전에 확인이 필요하다.

 

 

 

댓글