varchar와 nvarchar의 차이 쓰기


59

현재 SQL Server 2012 데이터베이스에서을 사용 varchar하고 있으며이를 변경하고 싶습니다 nvarchar. 이를 위해 스크립트를 생성했습니다.

내 질문은 SQL Server가 varchar열과 열에 쓰는 방법에 차이가 nvarchar있습니까? 우리는 내가 우려하는 많은 백엔드 절차를 가지고 있습니다.

편집 :
이것이 도움이되는지 확실하지 않지만 열에는 인덱스, f / k 또는 제약 조건이 없습니다.


답변:


46

유니 코드 문자열 리터럴 앞에 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
----
រៀន

실제 유니 코드 문자 대신 상자 문자를 표시하는 모바일 장치 또는 고독 브라우저의 경우 다음과 같습니다.

여기에 이미지 설명을 입력하십시오


37

가장 큰 관심사는 nvarchar문자 당 2 바이트 를 사용하는 반면 varchar1을 사용하는 것입니다. 따라서 * nvarchar(4000)와 동일한 양의 저장 공간을 사용합니다 varchar(8000).

두 배의 저장 공간이 필요한 모든 문자 데이터 외에도 다음과 같은 의미가 있습니다.

  • nvarchar8060 바이트 행 제한 / 8000 바이트 문자 열 제한 내에서 행을 유지 하려면 더 짧은 열 을 사용해야 할 수도 있습니다 .
  • nvarchar(max)열을 사용하는 경우 열 이 열보다 빨리 밀려납니다 varchar(max).
  • nvarchar900 바이트 인덱스 키 제한을 유지 하기 위해 더 짧은 열 을 사용해야 할 수도 있습니다 (이러한 큰 인덱스 키를 사용하려는 이유는 모르겠지만 절대 알 수는 없습니다).

그 외에도 nvarchar클라이언트 소프트웨어가 유니 코드를 처리하도록 구축되었다고 가정하면 작업에 큰 차이가 없습니다. SQL Server는 a varchar를 투명하게 상향 변환 nvarchar하므로 리터럴에 2 바이트 (예 : 유니 코드) 문자를 사용하지 않는 한 문자열 리터럴에 N 접두사가 필요하지 않습니다. 을 캐스팅 하면 동일한 작업을 수행하는 것과 다른 결과 nvarcharvarbinary얻을 수 varchar있습니다. 중요한 점은 응용 프로그램을 계속 작동시키기 위해 모든 varchar 리터럴을 nvarchar 리터럴로 즉시 변경할 필요가 없으므로 프로세스가 쉬워진다는 것입니다.

당신은 데이터 압축을 사용하는 경우 * (경량 행 압축이 충분를, Enterprise 버전이 필요합니다 SQL 서버 2016 SP1 전에 당신이 일반적으로 찾을 수) ncharnvarchar보다 더 많은 공간을 차지하지 char하고 varchar인해, 합니다 (SCSU 알고리즘을 사용하여) 유니 코드 압축 .


17

다음과 같은 주요 차이점을 생각하십시오.

  1. Nvarchar는 UNICODE 데이터를 저장합니다. UNICODE 또는 다국어 데이터를 저장해야하는 경우 nvarchar을 선택하십시오. Varchar는 ASCII 데이터를 저장하며 일반적인 사용을 위해 선택한 데이터 유형이어야합니다.
  2. 메모리 사용량과 관련하여 nvarchar는 문자 당 2 바이트를 사용하는 반면 varchar는 1을 사용합니다.
  3. VARCHAR에 NVARCHAR에 가입하면 성능이 크게 저하됩니다.
  4. 데이터를 삽입 할 때 N 접두사가 필요할 수 있습니다. INSERT dbo.t (c) SELECT N'ʤ ʥ ʦ ʧ ʨ ';
  5. 일부 전문가는 항상 다음과 같은 이유로 nvarchar를 권장합니다. 모든 최신 운영 체제 및 개발 플랫폼은 varchar 대신 nvarchar을 사용하여 내부적으로 유니 코드를 사용하므로 데이터베이스에서 읽거나 데이터베이스에 쓸 때마다 인코딩 변환을 피할 수 있습니다.

0

nvarchar는 모바일 DB에서 SQL Server 2005 로의 RDP 병합 복제에 필요했습니다. 또한 LTrim (), RTrim () 및 Trim ()은 많이 사용되었습니다. .

최근 몇 년 동안 변경되었는지 여부는 알지 못하지만 nvarchar는 이제 생성 된 데이터베이스에 사용 된 VS Pro 2017에서 .NET Simple Membership Website 로그인에 사용되는 표준입니다.


-3

Varchar 대신 NVarchar를 사용하고 MULTI-LINQUAL을 지원할 필요가없는 경우 DB, 백업 (로컬 및 오프 사이트)에 대한 스토리지가 증가합니다. 최신 데이터베이스는 둘 다 지원해야하며 디자인에서 모든 전환 조회수를 고려해야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.