현재 SQL Server 2012 데이터베이스에서을 사용 varchar
하고 있으며이를 변경하고 싶습니다 nvarchar
. 이를 위해 스크립트를 생성했습니다.
내 질문은 SQL Server가 varchar
열과 열에 쓰는 방법에 차이가 nvarchar
있습니까? 우리는 내가 우려하는 많은 백엔드 절차를 가지고 있습니다.
편집 :
이것이 도움이되는지 확실하지 않지만 열에는 인덱스, f / k 또는 제약 조건이 없습니다.
현재 SQL Server 2012 데이터베이스에서을 사용 varchar
하고 있으며이를 변경하고 싶습니다 nvarchar
. 이를 위해 스크립트를 생성했습니다.
내 질문은 SQL Server가 varchar
열과 열에 쓰는 방법에 차이가 nvarchar
있습니까? 우리는 내가 우려하는 많은 백엔드 절차를 가지고 있습니다.
편집 :
이것이 도움이되는지 확실하지 않지만 열에는 인덱스, f / k 또는 제약 조건이 없습니다.
답변:
유니 코드 문자열 리터럴 앞에 N 접두사를 붙여야합니다. 예를 들어 기본 데이터 유형이 NVARCHAR
다음 과 같은 경우 다르게 작동합니다 .
CREATE TABLE dbo.t(c NVARCHAR(32));
INSERT dbo.t(c) SELECT 'រៀន';
INSERT dbo.t(c) SELECT 'នរៀ';
INSERT dbo.t(c) SELECT N'រៀន';
SELECT c FROM dbo.t;
SELECT c FROM dbo.t WHERE c = 'រៀន';
SELECT c FROM dbo.t WHERE c = N'រៀន';
결과 :
c
----
??? -- not stored correctly
??? -- not stored correctly
រៀន -- stored correctly!
c
----
???
??? -- probably not expected, however all Unicode characters have been changed to ?
c
----
រៀន
실제 유니 코드 문자 대신 상자 문자를 표시하는 모바일 장치 또는 고독 브라우저의 경우 다음과 같습니다.
가장 큰 관심사는 nvarchar
문자 당 2 바이트 를 사용하는 반면 varchar
1을 사용하는 것입니다. 따라서 * nvarchar(4000)
와 동일한 양의 저장 공간을 사용합니다 varchar(8000)
.
두 배의 저장 공간이 필요한 모든 문자 데이터 외에도 다음과 같은 의미가 있습니다.
nvarchar
8060 바이트 행 제한 / 8000 바이트 문자 열 제한 내에서 행을 유지 하려면 더 짧은 열 을 사용해야 할 수도 있습니다 .nvarchar(max)
열을 사용하는 경우 열 이 열보다 빨리 밀려납니다 varchar(max)
.nvarchar
900 바이트 인덱스 키 제한을 유지 하기 위해 더 짧은 열 을 사용해야 할 수도 있습니다 (이러한 큰 인덱스 키를 사용하려는 이유는 모르겠지만 절대 알 수는 없습니다).그 외에도 nvarchar
클라이언트 소프트웨어가 유니 코드를 처리하도록 구축되었다고 가정하면 작업에 큰 차이가 없습니다. SQL Server는 a varchar
를 투명하게 상향 변환 nvarchar
하므로 리터럴에 2 바이트 (예 : 유니 코드) 문자를 사용하지 않는 한 문자열 리터럴에 N 접두사가 필요하지 않습니다. 을 캐스팅 하면 동일한 작업을 수행하는 것과 다른 결과 nvarchar
를 varbinary
얻을 수 varchar
있습니다. 중요한 점은 응용 프로그램을 계속 작동시키기 위해 모든 varchar 리터럴을 nvarchar 리터럴로 즉시 변경할 필요가 없으므로 프로세스가 쉬워진다는 것입니다.
당신은 데이터 압축을 사용하는 경우 * (경량 행 압축이 충분를, Enterprise 버전이 필요합니다 SQL 서버 2016 SP1 전에 당신이 일반적으로 찾을 수) nchar
과 nvarchar
보다 더 많은 공간을 차지하지 char
하고 varchar
인해, 합니다 (SCSU 알고리즘을 사용하여) 유니 코드 압축 .
다음과 같은 주요 차이점을 생각하십시오.