varchar와 nvarchar의 차이점은 무엇입니까?


1354

nvarchar멀티 바이트 문자 만 지원합니까? 그렇다면 실제로 스토리지 문제 이외의 다른 점이 varchars있습니까?


6
나는 incomudro의 요점을 좋아합니다. 처음에 varchar와 nvarchar의 차이점에 대해 파고 들었습니다. SQL Server db에 대한 Java 앱은 기본적으로 문자열을 nvarchar로 보내는 것처럼 보이는 myBatis를 사용합니다 (여전히 재정의 가능한 방법 (또는 if)인지 확실하지 않음). 간단한 쿼리는 선택하는 열을 nvarchar가 아닌 varchar로 정의하고 열의 인덱스를 무시했기 때문에 큰 성능 문제로 나타났습니다.
Sean 읽기

답변:


1652

nvarchar열은 유니 코드 데이터를 저장할 수있다. varchar열은 8 비트의 코드 페이지로 제한된다. 일부 사람들은 varchar공간을 덜 차지하기 때문에 사용해야 한다고 생각합니다 . 나는 이것이 정답이 아니라고 생각합니다. 코드 페이지 비 호환성은 고통스럽고 유니 코드는 코드 페이지 문제를 치료합니다. 요즈음 디스크와 메모리가 저렴하기 때문에 더 이상 코드 페이지로 시간을 낭비 할 이유가 없습니다.

모든 최신 운영 체제 및 개발 플랫폼은 내부적으로 유니 코드를 사용합니다. nvarchar대신에 를 사용 varchar하면 데이터베이스에서 읽거나 데이터베이스에 쓸 때마다 인코딩 변환을 피할 수 있습니다. 변환에는 시간이 걸리고 오류가 발생하기 쉽습니다. 전환 오류 복구는 사소한 문제가 아닙니다.

ASCII 만 사용하는 응용 프로그램과 인터페이스하는 경우 데이터베이스에서 유니 코드를 사용하는 것이 좋습니다. OS 및 데이터베이스 데이터 정렬 알고리즘은 유니 코드에서 더 잘 작동합니다. 유니 코드는 다른 시스템 과 인터페이스 할 때 변환 문제를 피 합니다. 그리고 당신은 미래를 준비 할 것입니다. 또한 완전한 유니 코드 스토리지의 이점을 누리면서도 유지 관리해야하는 레거시 시스템에 대해 데이터가 7 비트 ASCII로 제한되어 있는지 항상 확인할 수 있습니다.


8
이것은 좋은 정보입니다. 따라서 선택이 궁극적으로 프로세서 + 개발 오버 헤드 또는 스토리지 중 어느 것이 더 저렴한 지 중 하나가된다고 추론한다면 이것을 올바르게 이해하고 있습니까?
Matt Cashatt

141
@MatthewPatrickCashatt-당신은 그렇게 볼 수 있습니다. 그러나 모든 텍스트 데이터가 유니 코드로 되어있는 영광스러운 세상을 상상 하고 개발자가 어떤 인코딩이 무엇인지 생각할 필요가 없으며 전체 클래스의 오류가 발생하지 않는 경우, 정말 선택의 여지가 없습니다.
Jeffrey L Whitledge


8
@Martin Smith-이 경우 varchar가 제공하는 (소형 스토리지) 작은 이점이 사라집니다. 나는 varchar가 생각했던 것보다 더 나쁘다고 생각한다!
Jeffrey L Whitledge 0시 53 분

9
@PeterAllenWebb-UTF-16의 서로 게이트 쌍을 문자처럼 UCS-2에 저장할 수 있으므로 모든 유니 코드 데이터를 "저장"할 수 있습니다. 이는 데이터 저장 및 검색에 투명하게 작동합니다. 이제는 할 수없는 것은 BMP 외부에서 신뢰할 수있는 사례 변환 및 비교를 얻는 것입니다. 그러나 이에 대해서는 아무런 주장도하지 않았습니다. 따라서 처리하려는 Desseret 텍스트가 많은 경우 데이터베이스 외부에서 처리하는 것이 가장 좋습니다. 그러나 거기에 저장하는 것이 좋습니다. (물론 varchar도 당신을 도울 수 없습니다!)
Jeffrey L Whitledge

259

varchar : 가변 길이의 비 유니 코드 문자 데이터. 데이터베이스 데이터 정렬에 따라 데이터가 저장된 코드 페이지가 결정됩니다.

nvarchar : 가변 길이 유니 코드 문자 데이터. 비교를 위해 데이터베이스 데이터 정렬에 따라 다릅니다.

이 지식으로 무장 한 경우 입력 데이터와 일치하는 것을 사용하십시오 (ASCII v. Unicode).


5
varchar가 유니 코드 데이터를 저장할 수없는 것과 같은 제한이 있습니까? 모두 1과 0입니다. 중국어 콘텐츠를 varchar로 DB에 잘 저장할 수 있습니다. 그래도 UTF-8을 지정합니다. 그러면 어떻게 작동합니까?
Nishant

3
@Nishant 늦은 답변 : 물론 UTF-8을 varchar에 저장할 수는 있지만 SQL Server 문자열 기능이 손상됩니다. 응용 프로그램 내에서 모든 검색 / 변환을 수행하는 경우 가능합니다 (그러나 이점은 무엇입니까?). SS에서 지원하는 유니 코드 인코딩 만 UCS-2 (예, SS2k16 이전의 UTF-16이 아님)이며 해당 문자열 함수는 해당 인코딩에서만 작동합니다. BTW 인덱스는 어떻습니까? 임의의 데이터를 저장하려면 바이너리를 대신 사용하는 것이 좋습니다.
Adriano Repetti

예, 문자열 검색 기능을 중단합니다.
Nishant

8
알다시피, "작동하지 않습니다". 를 저장 같은 그의 floatint하고, 가고는 "잘 확인 소수가 실종." 하지마
user7116

70

나는 항상 nvarchar를 사용하여 내가 만들고있는 모든 것이 내가 던지는 모든 데이터를 견딜 수있게합니다. nvarchar를 사용했기 때문에 CMS 시스템이 실수로 중국어를 수행합니다. 요즘 새로운 응용 프로그램은 실제로 필요한 공간의 양에 관심을 가져서는 안됩니다.


25
새로운 앱이 공간 제한에 관심을 가져서는 안된다는 생각은 다소 근시안적이며, 대기업 수준의 데이터베이스를 다루는 사람이라면 누구나 완전히 틀리게 말할 것입니다.
Frater

60
tags2k의 입에 단어를 넣을 자유를 얻기 위해 더 정확한 진술은 '새로운 응용 프로그램이 국제화 및 기타 문자 집합 문제보다 필요한 공간에 대해 더 많은 관심을 기울여야 할 것'이 아니라고 생각합니다.
Cowan

1
"요즘에는 새로운 앱이 필요한 공간의 양과 관련이 없어야합니다." -무료 클라우드 스토리지를 사용하지 않는 한 유료 요금제가 $에서 상당히 뛰어납니다 (AppHarbor SQL Server 공유 요금제 참조).
ganders

3
@ganders Howl! 당신은 바로 거기에 있습니다. 일반화 된 진술은 단지 일시적으로 만 정확합니다. 컴퓨팅은 스윙과 로터리 게임입니다. Windows Azure CCP에서 얼마나 많은 공간을 사용하고 있는지 확실히 걱정하고 있습니다. 그것은 내가 nvarchar에 varchar를 사용하지 않을 것이라고 말했다. 우 방금 나 자신을 모순 했습니까?
rism

1
@rism, 나는 "never"적어도 기술적 으로 인용 부호를 사용하여 모순의 위험을 제거했다고 생각합니다 .
Smandoli

30

Oracle 설치 방법에 따라 다릅니다. 설치 과정에서 NLS_CHARACTERSET 옵션이 설정됩니다. 쿼리에서 찾을 수 있습니다 SELECT value$ FROM sys.props$ WHERE name = 'NLS_CHARACTERSET'.

NLS_CHARACTERSET이 UTF8과 같은 유니 코드 인코딩 인 경우 좋습니다. VARCHAR과 NVARCHAR 사용은 거의 동일합니다. 지금은 그만하세요. 그렇지 않으면 또는 Oracle 문자 세트를 제어 할 수없는 경우 계속 읽으십시오.

VARCHAR — 데이터는 NLS_CHARACTERSET 인코딩에 저장됩니다. 동일한 서버에 다른 데이터베이스 인스턴스가있는 경우 이들에 의해 제한 될 수 있습니다. 설정을 공유해야하기 때문에 그 반대도 마찬가지입니다. 이러한 필드는 해당 문자 세트를 사용하여 인코딩 할 수있는 모든 데이터를 저장할 수 있으며 그 밖의 다른 것은 없습니다 . 예를 들어 문자 집합이 MS-1252 인 경우 영어 문자, 소수의 악센트 부호 문자 및 기타 문자 (예 : € 및 —)와 같은 문자 만 저장할 수 있습니다. 응용 프로그램은 일부 지역에서만 유용하며 세계 어느 곳에서도 작동 할 수 없습니다. 이러한 이유로, 그것은 나쁜 생각으로 간주됩니다.

NVARCHAR — 데이터는 유니 코드 인코딩으로 저장됩니다. 모든 언어가 지원됩니다. 좋은 아이디어.

저장 공간은 어떻습니까? VARCHAR은 문자 세트 / 인코딩이 특정 로케일에 맞게 사용자 정의 설계 되었기 때문에 일반적으로 효율적입니다. NVARCHAR 필드는 NLS 설정에 따라 충분히 UTF-8 또는 UTF-16 인코딩으로 저장됩니다. UTF-8은 아시아 언어를 계속 지원하면서 "서양"언어에 매우 효율적입니다. UTF-16은 "서양"언어를 계속 지원하면서 아시아 언어에 매우 효율적입니다. 스토리지 공간이 염려되면 Oracle에서 UTF-8 또는 UTF-16을 적절히 사용하도록 NLS 설정을 선택하십시오.

처리 속도는 어떻습니까? 대부분의 새로운 코딩 플랫폼은 기본적으로 유니 코드 (Java, .NET, 심지어 몇 년 전의 C ++ std :: wstring!)를 사용하므로 데이터베이스 필드가 VARCHAR 인 경우 Oracle은 모든 읽기 또는 쓰기에서 문자 세트 간 변환을 강제하지 않습니다. NVARCHAR을 사용하면 변환을 피할 수 있습니다.

결론 : NVARCHAR을 사용하십시오! 제한 사항과 종속성을 피하고 저장 공간에 적합하며 일반적으로 성능에도 가장 좋습니다.


42
이것은 sql-server에 관한 질문을 제외하고는 정말 좋은 대답입니다.
stimms

21

nvarchar는 데이터를 유니 코드로 저장하므로 데이터 열에 다국어 데이터 (둘 이상의 언어)를 저장하려면 N 변형이 필요합니다.


16

내 두 센트

  1. 올바른 데이터 유형을 사용하지 않으면 인덱스가 실패 할 수 있습니다
    . SQL Server의 경우 : VARCHAR 열에 대한 인덱스가 있고 유니 코드 문자열을 나타내는 경우 SQL Server는 인덱스를 사용하지 않습니다. SmallInt를 포함하는 인덱스 열에 BigInt를 제공 할 때도 마찬가지입니다. BigInt가 SmallInt가되기에 충분히 작더라도 SQL Server는 인덱스를 사용할 수 없습니다. 다른 방법으로는이 문제가 없습니다 (인덱스 BigInt 및 NVARCHAR 열에 SmallInt 또는 Ansi-Code를 제공하는 경우).

  2. 데이터 유형은 DBMS (데이터베이스 관리 시스템)마다 다를 수 있습니다.
    모든 데이터베이스의 데이터 유형이 약간 다르며 VARCHAR이 모든 곳에서 동일한 것을 의미하지는 않습니다. SQL Server에는 VARCHAR 및 NVARCHAR이 있지만 Apache / Derby 데이터베이스에는 VARCHAR 만 있고 VARCHAR은 유니 코드입니다.


그러나 코드를 올바르게 작성하는 경우 (예 : 매개 변수화 된 쿼리 등) 포인트 1은 위험이 적습니다.
Paul

14

주로 nvarchar 는 유니 코드 문자를 저장 하고 varchar 는 유니 코드가 아닌 문자를 저장합니다.

"Unicodes"는 아랍어, 히브리어, 중국어, 일본어와 같은 다른 많은 언어의 문자를 단일 문자 세트로 인코딩 할 수있는 16 비트 문자 인코딩 체계를 의미합니다.

즉, 유니 코드는 문자 당 2 바이트를 사용하여 저장하고 비유 니코 드는 문자 당 1 바이트 만 사용하여 저장합니다. 이는 유니 코드가 아닌 유니 코드에 비해 저장하는 데 두 배의 용량이 필요하다는 것을 의미합니다.


10

네가 옳아. 1 바이트 문자 데이터 nvarcharvarchar저장 하는 동안 유니 코드 데이터를 저장합니다. 스토리지의 차이보다는 기타 ( nvarchar배 저장 공간이 필요합니다 varchar당신이 이미 언급), 선호하는 주된 이유 nvarchar이상 varchar(다른 언어, 즉 저장하는 문자열) 국제화 될 것입니다.


10

나는 그것이 달려 있다고 말한다.

OS가 현재 모든 Windows 시스템과 같이 유니 코드로 작동하고 언어가 기본적으로 유니 코드를 지원하는 데스크톱 응용 프로그램을 개발하는 경우 (기본 문자열은 Java 또는 C #과 같은 유니 코드 임) nvarchar로 이동하십시오.

문자열이 UTF-8로 제공되는 웹 응용 프로그램을 개발하고 언어가 PHP이며, 여전히 유니 코드를 기본적으로 (버전 5.x에서) 지원하지 않는 경우 varchar가 더 나은 선택 일 것입니다.


9

NVARCHAR유니 코드를 저장 하지만 데이터 정렬을 사용 VARCHAR하여 현지 언어의 데이터를 사용 하고 저장할 수도 있습니다.

다음 시나리오를 상상해보십시오.

DB의 데이터 정렬은 페르시아어이며 VARCHAR(10)데이터 유형에 'علی'(Als의 페르시아어 쓰기)와 같은 값을 저장합니다 . 문제가 없으며 DBMS는 3 바이트 만 사용하여 저장합니다.

그러나 데이터를 다른 데이터베이스로 전송하고 올바른 결과를 보려면 대상 데이터베이스는이 예에서 페르시아인 대상과 동일한 데이터 정렬을 가져야합니다.

대상 데이터 정렬이 다른 경우 대상 데이터베이스에 물음표 (?)가 표시됩니다.

마지막으로, 현지 언어를 사용하기 위해 거대한 데이터베이스를 사용하는 경우 공간을 너무 많이 사용하는 대신 위치를 사용하는 것이 좋습니다.

디자인이 다를 수 있다고 생각합니다. 작업 환경에 따라 다릅니다.


8

나는 대답을 보았고 더 이상 공간이 문제가되지 않기 때문에 많은 사람들이 nvarcharover 을 사용하는 것이 좋습니다 varchar. 따라서 여분의 저장 공간을 거의 사용하지 않기 위해 유니 코드를 활성화하는 데 아무런 해가 없습니다. 글쎄, 이것은 열에 색인을 적용하려는 경우 항상 사실이 아닙니다. SQL Server는 인덱싱 할 수있는 필드 크기가 900 바이트로 제한되어 있습니다. 따라서가있는 경우 varchar(900)색인을 생성 할 수는 있지만 색인을 생성 할 수는 없습니다 varchar(901). 을 사용하면 nvarchar문자 수가 반으로 줄어 최대 인덱싱 할 수 있습니다 nvarchar(450). 따라서 필요하지 않다고 확신하는 경우 nvarchar사용하지 않는 것이 좋습니다.

일반적으로 데이터베이스에서는 항상 확장 할 수 있으므로 필요한 크기를 유지하는 것이 좋습니다. 예를 들어, 직장 동료는 nvarchar(max)스토리지에 전혀 문제가 없으므로 컬럼 사용 에 아무런 해가 없다고 생각했습니다 . 나중에이 열에 인덱스를 적용하려고 할 때 SQL Server는이를 거부했습니다. 그러나 그가 짝수로 시작했다면, varchar(5)문제를 해결하기 위해 현장 마이그레이션 계획을 수행해야하는 문제없이 나중에 필요한 것으로 확장 할 수있었습니다.


7

nVarchar는 유니 코드 문자를 저장하는 데 도움이됩니다. 현지화 된 데이터를 저장하려는 경우가는 방법입니다.


7

단일 바이트를 사용하여 문자를 저장하는 경우 256 개의 가능한 조합이 있으므로 256 개의 다른 문자를 저장할 수 있습니다. 데이터 정렬은 문자와 문자를 비교하고 정렬하는 규칙을 정의하는 패턴입니다.

Latin1 (ANSI) 인 1252가 가장 일반적입니다. 1 바이트 문자 세트도 많은 언어에서 사용하는 모든 문자를 저장하기에 부적절합니다. 예를 들어 일부 아시아 언어에는 수천 개의 문자가 있으므로 문자 당 2 바이트를 사용해야합니다.

유니 코드 표준

네트워크에서 여러 코드 페이지를 사용하는 시스템을 사용하면 통신 관리가 어려워집니다. 표준화를 위해 ISO 및 유니 코드 컨소시엄에 유니 코드가 도입되었습니다 . 유니 코드는 2 바이트를 사용하여 각 문자를 저장합니다. 즉 65,536 개의 다른 문자를 정의 할 수 있으므로 거의 모든 문자를 유니 코드로 덮을 수 있습니다. 두 대의 컴퓨터가 유니 코드를 사용하는 경우 모든 기호가 동일한 방식으로 표시되며 변환이 필요하지 않습니다. 이것이 유니 코드의 기본 개념입니다.

SQL Server에는 두 가지 범주의 문자 데이터 유형이 있습니다.

  • 비 유니 코드 (char, varchar 및 text)
  • 유니 코드 (nchar, nvarchar 및 ntext)

여러 국가의 문자 데이터를 저장해야하는 경우 항상 유니 코드를 사용하십시오.


6

나는 (내가 아마 메모 대신에 자신을 열어 갈거야 실현!) 여기에서 말해야한다, 그러나 확실하게 유일한 시간 때 NVARCHAR실제로 (통지가 유용 있다!) 이상의 VARCHAR경우 모두에 정렬의 모든 종속 시스템과 데이터베이스 자체 내에서 동일합니까? 그렇지 않은 경우 데이터 정렬 변환이 어쨌든 발생해야하므로 VARCHAR만큼 가능합니다 NVARCHAR.

여기에 추가하기 위해 SQL Server (2012 이전) 와 같은 일부 데이터베이스 시스템 의 페이지 크기는 약 1입니다. 8K. 따라서 검색 가능한 데이터를 a TEXT또는 NTEXT필드 와 같이 저장하지 않으려 VARCHAR는 경우 8k의 전체 공간 을 제공하는 반면 NVARCHAR4k 만 제공합니다 (바이트의 두 배, 공간의 두 배).

요약하자면 두 가지 중 하나의 사용이 다음에 의존한다고 가정합니다.

  • 프로젝트 또는 맥락
  • 하부 구조
  • 데이터베이스 시스템

6

Sql Server VARCHAR과 NVARCHAR 데이터 형식의 차이점을 따르십시오 . 여기에서는 매우 설명적인 방식으로 볼 수 있습니다.

일반적으로 nvarchar는 데이터를 유니 코드로 저장하므로 데이터 열에 다국어 데이터 (둘 이상의 언어)를 저장하려면 N 변형이 필요합니다.


이것은 매우 유용한 링크이지만 귀하의 답변은 그 이상의 것입니다 : 링크.
RubberDuck

ckuhn203, 나는 당신에게 이것을 보라고 말하지 않을 것입니다
Pradeep Kesharwani

6

와의 주요 차이점은 다음 Varchar(n)nvarchar(n)같습니다. 여기에 이미지 설명을 입력하십시오

Varchar(가변 길이, 비 유니 코드 문자 데이터) 크기는 최대 8000입니다. 1. 가변 길이 데이터 유형입니다.

  1. 비 유니 코드 문자를 저장하는 데 사용

  2. 각 문자에 대해 1 바이트의 공간을 차지합니다.

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

Nvarchar: 가변 길이의 유니 코드 문자 데이터.

1. 가변 길이 데이터 타입

2. 유니 코드 문자를 저장하는 데 사용됩니다.

  1. 데이터는 유니 코드 인코딩으로 저장됩니다. 모든 언어가 지원됩니다. (예 : 아랍어, 독일어, 힌디어 등의 언어)

6

~ 47000 명성 점수를 가진 Jeffrey L Whitledge는 nvarchar의 사용을 권장합니다

평판 점수가 ~ 33200 인 Solomon Rutzky는 다음을 권장합니다. NVARCHAR을 항상 사용하지 마십시오. 그것은 매우 위험하고 종종 비용이 많이 드는 태도 / 접근법입니다.

varchar와 nvarchar SQL Server 데이터 형식의 주요 성능 차이는 무엇입니까?

https://www.sqlservercentral.com/articles/disk-is-cheap-orly-4

높은 명성을 가진 두 사람 모두 학습 SQL Server 데이터베이스 개발자는 무엇을 선택합니까?

선택에 일관성이없는 경우 성능 문제에 대한 답변 및 의견에 많은 경고가 있습니다.

성능에 대한 의견 pro / con nvarchar가 있습니다.

성능에 대한 의견 pro / con varchar가 있습니다.

수백 개의 열이있는 테이블에 대한 특별한 요구 사항이 있습니다.

SQL * server 2012의 8060 바이트 테이블 레코드 크기 제한에 근접하지 않도록 varchar를 선택하고 있습니다.

나를 위해 nvarchar를 사용하면이 8060 바이트 제한을 초과합니다.

또한 관련 코드 테이블의 데이터 유형을 기본 중앙 테이블의 데이터 유형과 일치시켜야한다고 생각합니다.

나는 경험이 풍부한 데이터베이스 개발자에 의해 사우스 오스트레일리아 정부 의이 작업 장소에서 varchar 열을 사용하는 것을 보았습니다. 예상 데이터 행 볼륨이이 결정의 일부가 될 수 있습니다.


1

nvarchar유니 코드 문자도 허용 varchar하기 때문에 코드 오류를 없애기 위해 (타입 불일치)하기 위해 비교하는 것이 안전합니다 nvarchar. whereSQL Server 쿼리에서 조건을 사용할 때 =연산자를 사용하는 경우 몇 번 오류가 발생합니다. 가능한 이유는 매핑 열이로 정의되어 있기 때문입니다 varchar. 우리 nvarchar가이 문제 에서 그것을 정의하면 내 일은 일어나지 않습니다. 여전히 우리는 varchar이 문제를 고수 하고 피하기 LIKE보다는 키워드를 사용하는 것이 좋습니다 =.

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