개발 메모장

[MS-SQL] JDBC 비유니코드 설정 본문

DBMS

[MS-SQL] JDBC 비유니코드 설정

yyyyMMdd 2025. 4. 25. 14:32
728x90

#. 쿼리의 길이가 길어지고 데이터가 많아질수록 속도는 느려지기 마련입니다.


#. DBMS에선 빠른데 Java를 통해 처리하는 쿼리가 느린 경우가 있었습니다.


  • 우선 SQL Server JDBC Driver는 String 타입의 파라미터를 NVARCHAR로 보내어 쿼리를 실행합니다.

  • 이 경우 해당 테이블의 필드 타입이 NVARCHAR가 아닌 경우 우선순위에 따라 필드 타입을 형변환하게 됩니다.

  • 저의 경우 VARCHAR 필드에 NVARCHAR 데이터를 매핑하다보니 암시적 형변환이 일어나서 JAVA에선 더욱 느리게 느껴졌던 것입니다.

  • 그렇다고 기존의 필드를 NVARCHAR로 바꿀수도 없으므로 아래와 같이 문구 하나만 추가해줍니다.
    (JDBC 드라이버가 PreparedStatement로 문자열을 보낼 때 Unicode 방식이 아닌 기본 문자셋(ASCII 또는 OS 로케일 기반)으로 전송하도록 설정하는 옵션입니다.)
database.url = jdbc:sqlserver://localhost:8080;database=데이터베이스;sendStringParametersAsUnicode=false

#. sendStringParametersAsUnicode=true 일 때

  • default 값은 TRUE

  • TRUE일 경우 문자열  파라미터의 문자열을 nvarchar로 전송합니다.

  • JDBC 드라이버는 문자열을 Unicode로 처리하게 됩니다.

  • NVARCHAR가 VARCHAR보다 처리 우선순위가 높아 VARCHAR 필드에 NVARCHAR 파라미터가 매핑될 경우 필드에 암시적 형변환이 발생하게 되고 INDEX도 깨지게 됩니다.

  • 인덱스가 있어도 사용되지 않으므로 성능 저하 발생 (Index Scan 발생)

  • 일부 문자 깨짐 또는 매칭 실패 가능성이 있으며 형변환 오류 가능성 상승

  • SQL Server가 VARCHAR 필드를 NVARCHAR로 변환하는 작업을 수행하므로 불필요한 CPU 사용
exec sp_executesql N'SELECT * FROM Users WHERE name = @P0',
                   N'@P0 nvarchar(4000)', 
                   N'홍길동'
 
	-- 내부적으로: CONVERT(nvarchar, N'홍길동') = name

 

- 이와 같이 쿼리의 파라미터를 NVARCHAR로 변경하여 실행할 경우 아래와 같이 조건자가 형변환하는 모습을 볼 수 있습니다.

- @P0의 타입을 VARCHAR로 변경하면 name 필드의 타입과 동일하기 때문에 아래와 같이 형변환이 이뤄지지 않습니다.


#. sendStringParametersAsUnicode=false 일 때

  • 장점

    - 문자열을 Unicode가 아닌 일반 문자열 (varchar)로 전송하기 때문에 암시적 형변환이 일어나지 않고 이로 인해 인덱스를 제대로 탈 수 있고 성능이 향상 됩니다.

    (필드타입이 NVARCHAR이고 파라미터가 VARCHAR인 경우 우선순위가 낮은 VARCHAR가 형변환이 일어나게 되지만 인덱스는 유지할 수 있습니다.)

    - 또한 불필요한 형변환이 일어나지 않기 때문에 CPU 부담이 낮아집니다.

    - SQL Server에는 파라미터 값이 N'abc'가 아닌 'abc'와 같은 형태로 SQL로 전송되어 문자비교가 간단해져 대량의 데이터를 조회할 때 속도가 향상될 수 있습니다.

  • 단점

    - 숫자나 영어를 다루는 경우 장점이긴하나 한글이 포함되게 되면 문자가 깨질 수 있어 반드시 확인이 필요합니다.

    - DBMS에서 한글이 깨지는 지는 아래를 통해 SQL server의 코드페이지를 확인해봐야합니다.
SELECT SERVERPROPERTY('Collation') AS Collation;

-- Korean_Wansung_CI_AS	949 (EUC-KR) 기반(문제없음)
-- Korean_Unicode_CI_AS	Unicode 기반 (문제 없음)
728x90

       - OS에서는 cmd > chcp를 입력해 확인하면 됩니다.

       - 필드 타입이 NVARCHAR인 경우 VARCHAR가 형변환이 일어나게되어로 암시적 형변환이 일어나게 되고 인덱스가 깨지고 INDEX SCAN을 유발시킵니다.


       - 여러 언어를 지원하는 서비스의 경우 TRUE로 설정하는 것이 좋습니다.

 

===========================================================
틀린 내용이 있거나 이견 있으시면 언제든 가감 없이 말씀 부탁드립니다!
===========================================================

728x90

'DBMS' 카테고리의 다른 글

[Redis] STS > Redis 적용 예제  (0) 2024.04.22
[Redis] Redis CLI 명령어 모음  (0) 2024.04.12
[Oracle] WITH문 사용방법  (0) 2024.04.08
[MS-SQL] 마스킹 Function  (0) 2024.02.06
[Oracle] SQL 튜닝  (2) 2023.12.05