SQL Server에서 char, nchar, varchar 및 nvarchar의 차이점은 무엇입니까?


622

무엇을 의미 nvarchar합니까?

차이점은 무엇이며 char, nchar, varchar, 및 nvarcharSQL Server의는?

답변:


856

정리하거나 요약하면 ...

  • ncharnvarchar저장할 수있는 유니 코드 문자를.
  • char유니 코드를 저장할 수없는 문자를.varchar
  • charnchar되는 길이 고정 됩니다 저장 공간을 확보 당신이 모든 공간을 사용하지 않는 경우에도 사용자가 지정한 문자의 번호를.
  • varchar하고 nvarchar있는 가변 길이 에만 저장하는 문자 공간을 사용합니다. 이 같은 스토리지를 보유하지 않습니다 charnchar .

nchar그리고 nvarchar당신이 필요로하는 경우에만이를 사용하는 것이 현명 할 수 있도록 저장 공간으로 두 번 차지합니다 유니 코드 지원.


15
char 및 varchar는 유니 코드를 저장하기위한 것이 아니라 일부 추가 코딩 트릭과 추가 논리를 사용하면 유니 코드 저장을 위해 [var] char 필드를 잘못 사용할 수 있습니다.
Wim ten Brink

10
내 대답이 보여주는n... 것보다 두 배의 저장 공간
Martin Smith

7
스토리지 예약의 이점은 무엇입니까?
mlissner

4
마지막 요점 : 대부분의 경우 유니 코드 nchar 및 nvarchar를 사용하는 것이 더 나은데, 데이터 정렬 및 사용자의 유연성이 향상되어 향후 호환성 문제가 해결됩니다. 그리고 유니 코드없이 데이터 정렬을 사용하는 것은 많은 번거 로움으로 인해 저장 공간은 문제가되지 않습니다. 메모리 속도는 앞으로도 계속 감소 할 것입니다.
Jaison Varghese

6
@BenCaine char (20)은 20 바이트를 사용합니다 (8 비트 데이터 정렬 가정). varchar (20)은 len (data) +2 바이트, 즉 20 바이트의 데이터에 22, 10 바이트의 데이터에 12 만 사용합니다. 여분의 2 바이트는 길이 레코드입니다. 데이터가 항상 전체 길이 인 경우 공간을 절약하고 더 빠를 수 있으므로 문자를 사용하십시오. varchar (1) 또는 실제로 varchar (4)보다 작은 것을 사용하지 마십시오. varchar 형식의 단일 문자는 3 바이트를 사용하므로 char (3)은 varchar (3)보다 더 많은 공간을 사용하지 않습니다.
Richard Gadsden

95

지금까지의 모든 대답 varchar은 단일 바이트, nvarchar 이중 바이트 임을 나타냅니다 . 첫 번째 부분은 실제로 아래 그림과 같이 데이터 정렬에 따라 다릅니다 .

DECLARE @T TABLE
(
C1 VARCHAR(20) COLLATE Chinese_Traditional_Stroke_Order_100_CS_AS_KS_WS,
C2 NVARCHAR(20)COLLATE  Chinese_Traditional_Stroke_Order_100_CS_AS_KS_WS
)

INSERT INTO @T 
    VALUES (N'中华人民共和国',N'中华人民共和国'),
           (N'abc',N'abc');

SELECT C1,
       C2,
       LEN(C1)        AS [LEN(C1)],
       DATALENGTH(C1) AS [DATALENGTH(C1)],
       LEN(C2)        AS [LEN(C2)],
       DATALENGTH(C2) AS [DATALENGTH(C2)]
FROM   @T  

보고

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

점을 유의 문자가 아직 표현되지 않은 VARCHAR버전을 자동으로 대체되었다 ?.

실제로 해당 데이터 정렬에서 단일 바이트로 표시 할 수있는 한자는 없습니다. 유일한 단일 바이트 문자는 전형적인 서부 ASCII 세트입니다.

이 때문에 그것은 행을 삽입 할 수있다 nvarchar(X)(A)에 열 varchar(X)truncation 에러 실패하는 (X는 두 경우에 동일 번호를 나타낸다).

SQL Server 2012는를 지원하는 SC (Supplementary Character) 데이터 정렬을 추가합니다 UTF-16. 이러한 데이터 정렬에서 단일 nvarchar문자는 2 또는 4 바이트를 사용할 수 있습니다.


4
내가 찾던 대답의 종류. 또한 영어를 좋아하지 않는 텍스트는 "중국인"으로 번역됩니다 translate.google.com/#auto/en/…
Igand

34

nchar와 char는 nvarchar와 varchar처럼 서로 정확히 같은 방식으로 작동합니다. 그들 사이의 유일한 차이점은 varchar가 아닌 nchar / nvarchar가 유니 코드 문자 (확장 문자 집합을 사용해야하는 경우 필수)를 저장한다는 것입니다.

유니 코드 문자에는 더 많은 저장 공간이 필요하므로 nchar / nvarchar 필드는 두 배의 공간을 차지합니다 (예 : 이전 버전의 SQL Server에서는 nvarchar 필드의 최대 크기는 4000입니다).

이 질문의 중복 이 하나 .


3
nchar은 고정 길이를 사용하므로 nchar (10)은 항상 10자를 수신해야합니다. 그리고 varchar (10)은 실제로 유니 코드이며 최대 10 자의 문자를 허용합니다. msdn.microsoft.com/en-us/library/ms186939.aspx
Wim ten Brink

33

: 그냥 뭔가 더 추가 NCHAR를 - 데이터에 후행 공백을 추가합니다. nvarchar- 데이터에 후행 공백을 추가하지 않습니다.

따라서 'nchar'필드로 데이터 세트를 필터링하려는 경우 RTRIM을 사용하여 공백을 제거 할 수 있습니다. 예를 들어 BRAND라는 nchar (10) 필드에는 NIKE라는 단어가 저장됩니다. 단어 오른쪽에 6 칸을 더합니다. 따라서 필터링시 식은 다음과 같아야합니다. RTRIM (Fields! BRAND.Value) = "NIKE"

내가 지금 조금 어려움을 겪고 있었기 때문에 이것이 누군가를 도울 수 있기를 바랍니다.


24

기존 답변을 요약하고 수정하려는 시도 :

먼저, char그리고 nchar반면에 항상 저장되는 문자열이 가능한 공간보다 작은 경우라도, 저장 공간의 고정 된 양을 사용 varchar하고 nvarchar그 문자열 (플러스 헤드의 2 바이트를 저장하는 데 필요한만큼의 저장 공간으로 만 사용되며, 아마도 문자열 길이를 저장할 것입니다). 따라서 "var"은 가변 공간에서와 같이 "가변"을 의미합니다.

이해 번째 중요한 점은 인, ncharnvarchar이용 저장 문자열 정확히 반면, 문자 당 2 바이트 charvarchar것이다 조합 코드 페이지에 의해 결정된 부호화 사용할 통상 (가, 예외 아래 참조하지만) 문자 당 정확히 하나의 바이트 수있다. 여기서 기억해야 할 기본적인 일이 있다는 것입니다 수 있도록 문자 당 2 바이트를 사용하여 문자의 매우 넓은 범위, 저장할 수 ncharnvarchar당신이 아마 할 국제화 지원을 할 때 훨씬 더 나은 선택이 될 경향이있다.

이제 좀 더 좋은 점이 있습니다.

첫째, ncharnvarchar열은 항상 UCS-2 사용하여 데이터를 저장합니다. 이는 문자 당 정확히 2 바이트가 사용되며 BMP (Basic Multilingual Plane)의 모든 유니 코드 문자는 nchar또는 nvarchar필드 로 저장 될 수 있음을 의미 합니다. 그러나, 그 경우가 아니라 모든 유니 코드 문자가 저장 될 수있다. 예를 들어 Wikipedia에 따르면 이집트 상형 문자의 코드 포인트는 BMP 외부에 있습니다. 따라서 UTF-8로 표현할 수있는 유니 코드 문자열과 SQL Server nchar또는 nvarchar필드에 저장할 수없는 다른 실제 유니 코드 인코딩이 있으며 이집트 상형 문자로 작성된 문자열이 그 중 하나입니다. 다행히도 사용자는 해당 스크립트를 작성하지 않지만 명심해야 할 내용입니다.

또 다른 혼란을하지만, 다른 포스터 강조했다고 흥미로운 점은 것입니다 charvarchar데이터 정렬 코드 페이지가 필요한 경우 필드는 특정 문자에 대한 문자 당 2 바이트를 사용할 수 있습니다. (Martin Smith는 Chinese_Traditional_Stroke_Order_100_CS_AS_KS_WS가이 동작을 어떻게 나타내는 지 보여주는 훌륭한 예를 제공합니다. 확인하십시오.)

업데이트 : SQL Server 2012부터 최종적으로 UTF-16 에 대한 코드 페이지 ( 예 : Latin1_General_100_CI_AS_SC)가 있으며 전체 유니 코드 범위를 실제로 포함 할 수 있습니다.


14
  • char: 최대 길이가 8000자인 고정 길이 문자 데이터.
  • nchar: 최대 길이가 4000자인 고정 길이 유니 코드 데이터
  • Char = 8 비트 길이
  • NChar = 16 비트 길이

char8 비트 길이를 가질 수 없습니다. 길이를 저장할 필요가 없으며 고정 길이는 최대 8000 자입니다.
John B. Lambe

12

nchar[(n)] (국가적 인물)

  • 고정 길이 유니 코드 문자열 데이터
  • n 문자열 길이를 정의하며 1에서 4,000 사이의 값이어야합니다.
  • 스토리지 크기는 2 배 n바이트입니다.

nvarchar [(n | max)] (국가 특성이 다름)

  • 가변 길이 유니 코드 문자열 데이터.
  • n 문자열 길이를 정의하며 1에서 4,000 사이의 값이 될 수 있습니다.
  • max 최대 스토리지 크기가 2 ^ 31-1 바이트 (2GB)임을 나타냅니다.
  • 스토리지 크기 (바이트)는 입력 된 실제 데이터 길이의 2 배 + 2 바이트입니다.

char [(n)] (캐릭터)

  • 고정 길이, non-Unicode문자열 데이터
  • n 문자열 길이를 정의하며 1에서 8,000 사이의 값이어야합니다.
  • 저장소 크기는 n바이트입니다.

varchar [(n | max)] (캐릭터 변경)

  • 가변 길이의 비 유니 코드 문자열 데이터
  • n 문자열 길이를 정의하며 1에서 8,000 사이의 값이 될 수 있습니다.
  • max 최대 스토리지 크기가 2 ^ 31-1 바이트 (2GB)임을 나타냅니다.
  • 스토리지 크기는 입력 된 데이터의 실제 길이 + 2 바이트입니다.

7

차이점 은 다음 같습니다.

  1. n [var] char는 유니 코드를 저장하고 [var] char은 1 바이트 문자 만 저장합니다.
  2. [n] char은 정확한 길이의 고정 된 수의 문자를 요구하는 반면, [n] varchar는 정의 된 길이까지의 가변적 인 수의 문자를 허용합니다.

또 다른 차이점은 길이입니다. nchar와 nvarchar는 최대 4,000 자까지 가능합니다. 그리고 char와 varchar는 최대 8000 자까지 가능합니다. 그러나 SQL Server의 경우 최대 2,147,483,648자를 처리 할 수있는 [n] varchar (max)를 사용할 수도 있습니다. (2 기가 바이트, 부호있는 4 바이트 정수)


7

nchar은 nvarchar 보다 많은 공간을 필요로합니다 .

예를 들어

5를 입력하더라도 nchar (100)은 항상 100자를 저장합니다. 나머지 95 개의 문자는 공백으로 채워집니다. nvarchar (100)에 5자를 저장하면 5자가 저장됩니다.


6
char (100)을 최대 100 자로 채워야하므로 완전히 사실이 아닙니다. 예를 들어 데이터베이스에 전화 번호를 저장하거나 길이가 고정 된 주문 번호를 사용할 때이 옵션을 사용합니다. 필드 길이는 고정되어 있으므로 최대 문자 수까지 채울 수 없습니다. 그러나 모든 데이터가 레코드 당 100자인 경우 길이 표시가 필요하지 않기 때문에 char (100)은 varchar (100)보다 적은 저장 공간을 차지합니다. 모든 값은 정확히 100 자입니다.
Wim ten Brink

5

nchar (10)은 길이가 10 인 고정 길이 유니 코드 문자열입니다. nvarchar (10)은 최대 길이가 10 인 가변 길이 유니 코드 문자열입니다. 일반적으로 모든 데이터 값이 10 자이고 후자 인 경우 전자를 사용합니다. 길이가 다른 경우.


잘못된 비교-질문은 nchar 및 nvarchar가 아닌 nchar 및 varchar와 관련이 있습니다.
Luke Bennett

4
  • nchar은 고정 길이이며 유니 코드 문자를 포함 할 수 있습니다. 문자 당 2 바이트 저장 영역을 사용합니다.

  • varchar의 길이는 가변적이며 유니 코드 문자를 포함 할 수 없습니다. 문자 당 1 바이트 스토리지를 사용합니다.


잘못된. 유니 코드는 모든 문자에 대해 1-4 바이트 (일반)를 사용할 수 있습니다. 또한 varchar는 유니 코드를 보유 할 수 있지만 유니 코드로 인식되지 않습니다. 결과적으로, varchar는 유니 코드 저장에 신뢰할 수없는 것으로 간주됩니다. (특히 필드에 접근하는 코드가 코드를 잘못 번역 할 위험이 있기 때문에)
Wim ten Brink

@ 알렉스 : 나는 당신이 당신의 요점을 생각하지만 여전히 당신과 동의하지 않습니다. 당신이 말하는 것은 int가 long이 2 ^ 32보다 작 으면 long을 길게한다는 것입니다. 이것은 '신뢰할 수없는'것이 아니라 전체 가치 범위를 다루는 것을 불가능하게하는 본질적인 한계입니다.
Manu

4
@Workshop Alex : 틀 렸습니다. UCS-2(SQL Server에서 사용되는 인코딩으로) 인코딩 된 유니 코드 는 모든 문자를 정확히 2 바이트로 저장합니다 . msdn.microsoft.com/en-us/library/bb330962%28v=sql.90%29.aspx :를 참조 하십시오SQL Server stores Unicode in the UCS-2 encoding scheme... UCS-2 is a fixed-length encoding that represents all characters as a 16-bit value (2 bytes) . SQL Server 2008은 SCSU 압축을 사용할 수 있지만 여전히 UCS-2로 인코딩 된 유니 코드 문자열을 압축합니다. msdn.microsoft.com/en-us/library/ee240835.aspx
Remus Rusanu

2

NVARCHAR 은 유니 코드 문자를 저장할 수 있으며 문자 당 2 바이트를 사용합니다.


1
잘못된! 유니 코드는 문자 당 1 ~ 4 바이트를 사용합니다! 많은 사람들이 이것을 잊어 버립니다! UTF-16을 사용하더라도 일부 문자는 2 대신 4 바이트를 사용하지만 공통 길이는 2 바이트입니다. 유니 코드의 다른 하위 형식에는 4 바이트 이상이 걸릴 수 있습니다!
Wim ten Brink

7
@WimtenBrink-질문은 SQL Server에 관한 것이며 nvarchar항상 문자 당 2 바이트를 사용합니다.
Martin Smith

@Wim, 다른 바이트 수를 생성 할 수있는 유니 코드에 대한 여러 인코딩이 있습니다. 그러나 SQL Server는 유니 코드 인코딩에 대한 선택을 제공하지 않습니다. 2012 년 이전의 SQL Server는 2 바이트 너비의 UCS-2 만 사용했기 때문에 Martin은 답을 쓸 당시에 정확했습니다. 위의 다른 답변에서 알 수 있듯이 SQL Server 2012는 이제 UTF-16을 제공하므로 많은 문자 (유니 코드 기본 다중 평면의 문자)에 2 바이트, 다른 문자에 4 바이트를 제공합니다.
콘크리트 가넷
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.