compile("com.microsoft.sqlserver:mssql-jdbc:6.4.0.jre8") // Spring boot ext['mssql-jdbc.version'] = '6.4.0.jre8' compile("com.microsoft.sqlserver:mssql-jdbc")
com.microsoft.sqlserver.jdbc.SQLServerDriver
jdbc:sqlserver://host:port;databaseName=dbname;sendStringParametersAsUnicode=false
설정값이 millisecond와 second가 섞여 있어서 매우 주의해야 함.
loginTimeout=second
: connection timeout 역할 초 단위socketTimeout=millisecond
밀리초 단위queryTimeout=second
초 단위lockTimeout=millisecond
: Lock을 기다리는 시간. sessionTimeout, queryTimeout보다는 작은값이어야 할 듯.varchar
이고 파라미터가 nvarchar
일 경우에는 우선순위가 낮은 varchar
타입 컬럼 값을 nvarchar
로 일일이 변환해서 값을 비교하기 때문에 성능이 저하되게 됨# JDBC URL 파라미터로 아래 지정하면 VARCHAR 로 강제로 전송함 sendStringParametersAsUnicode=false 단, 이 경우에도 JDBC 4 에서 지원하는 setNString() 같은 setN* 계열 사용시에는 Unicode로 전송한다. # sendStringParametersAsUnicode=false 상황에서도 NVARCHAR 전송이 필요하면 pStmt.setObject(2,Id,Types.NVARCHAR); //강제로 Unicode로 전송 # 혹은 setNString() 사용
sendStringParametersAsUnicode=false
로 VARCHAR 전송시에 JDBC Driver가 SQLServer 에 지정된 Collation에 따라서 문자열.getBytes(Collation.charset)
으로 byte 배열로 변환하여 전송한다. 완성형의 경우에는 CP949
로 변환.com.microsoft.sqlserver.jdbc.AppDTVImpl.SetValueOp
에서 collcation에 따른 charset으로 변환해 보내는 코드 있음.convert
로 처리한다.... WHERE varcharcolumn = CONVERT(VARCHAR, ?) // 굳이 이렇게 안해도 자동으로 됨.
jdbcType=NVARCHAR
사용SELECT * FROM books WHERE author = #{author} AND title LIKE #{title,jdbcType=NVARCHAR}
java.util.logging
사용com.microsoft.sqlserver
: info
이상com.microsoft.sqlserver.jdbc
: debug
The database name component of the object qualifier must be the name of the current database.
withCatalogName()
, withSchemaName()
등을 사용해 명시적으로 catalog name을 지정해주면 괜찮다.