Care este diferența între char, nchar, varchar, și nvarchar în SQL Server?

Ce se înțelege prin nvarchar?

Care este diferența între char, nchar, `varchar", și " nvarchar în SQL Server?

Soluția

Doar pentru a clarifica... sau rezuma...

  • nchar și nvarchar poate stoca Unicode de caractere.
  • char și varchar nu se poate stoca Unicode de caractere.
  • char și nchar sunt lungime fixă care va spațiu de stocare de rezervă pentru numărul de caractere care specifica, chiar dacă tu nu't folosi tot acel spațiu.
  • varchar și nvarchar sunt lungime variabilă care va utiliza numai în spații pentru caracterele magazin. L nu va stocare de rezervă ca char " sau " nchar.

nchar " și " nvarchar va lua de două ori mai mult spațiu de stocare, astfel încât acesta poate fi înțelept să le folosească numai în cazul în care aveți nevoie Unicode suport.

Comentarii (10)

Toate răspunsurile de până acum indică faptul că varchar este singur octet, nvarchar este dublu octet. Prima parte a acestui fapt depinde de colaționare așa cum este ilustrat mai jos.

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  

Se întoarce

Rețineți că 华 " și " 国 personaje încă nu au fost reprezentate în VARCHAR versiune și au fost tăcere înlocuit cu ?.

Există de fapt încă nici caractere Chinezești care pot fi reprsented de un singur octet în care colaționare. Doar un singur octet de caractere sunt tipic occidentale ASCII set.

Din aceasta cauza este posibil pentru un insert dintr-o nvarchar(X) coloana de la un varchar(X) coloana a eșua, cu o trunchiere error (unde X reprezintă un număr care este același în ambele cazuri).

SQL Server 2012 adaugă SC (Caracter Suplimentar) colaționări care sprijin UTF-16. În aceste colaționări o singur nvarchar caracter poate avea 2 sau 4 octeți.

Comentarii (1)

nchar și char destul de mult funcționează în exact același mod ca și celălalt, la fel ca nvarchar și varchar. Singura diferență între ele este că nchar/nvarchar magazin de caractere Unicode (esențiale, dacă aveți nevoie de utilizarea de seturi extinse de caractere), în timp varchar nu.

Pentru caractere Unicode necesită mai mult spațiu de stocare, nchar/nvarchar câmpuri ia de două ori mai mult spațiu (de exemplu în versiunile anterioare de SQL Server dimensiunea maximă a unui nvarchar domeniu este de 4000).

Această întrebare este un duplicat al aceasta.

Comentarii (1)

Doar să mai adaug ceva: nchar - adaugă spații de date. nvarchar - nu se adaugă spații de date.

Deci, dacă aveți de gând pentru a filtra date de o 'nchar' domeniu, poate doriți să utilizați RTRIM pentru a elimina spațiile. E. g. nchar(10) domeniul numitele magazine de BRAND cuvântul NIKE. Se adaugă 6 spații la dreapta cuvântului. Deci, atunci când filtrarea, expresia ar trebui să citească: RTRIM(Domenii!De BRAND.Valoarea) = "NIKE"

Sper că acest lucru ajută cineva acolo pentru că mă luptam cu ea un pic, doar acum!

Comentarii (0)

Încercarea mea de a rezuma și de a corecta existente răspunsuri:

În primul rând, char și nchar va folosi întotdeauna o sumă de spațiu de stocare, chiar și atunci când șir pentru a fi depozitată este mai mică decât spațiul disponibil, întrucât varchar " și " nvarchar va folosi doar la fel de mult spațiu de stocare este necesar pentru a stoca că șirul (plus doi octeți de deasupra capului, probabil pentru a stoca șirul de lungime). Deci, amintiți-vă, "var" inseamna "variabil", ca în spațiu variabil.

Al doilea punct important de înțeles este că, nchar " și " nvarchara stoca siruri de caractere folosind *exact* doi octeți pe caracter, întrucâtcharșivarcharfolosi o codificare determinată de colaționare pagina de cod, care va *de obicei* fi exact un octet pentru fiecare caracter (deși există și excepții, a se vedea mai jos). Cu ajutorul a doi octeți pe caracter, o gamă foarte largă de personaje pot fi stocate, astfel încât bază de lucru de reținut aici este că nchar " și " nvarchar tind să fie o alegere mult mai bună atunci când doriți suport de internaționalizare, care, probabil, nu.

Acum, pentru unele unele puncte fine.

În primul rând, nchar " și " nvarchar coloane *întotdeauna* stoca date folosind UCS-2. Acest lucru înseamnă că exact doi octeți pentru fiecare caracter va fi folosit și orice caractere Unicode în Basic Multilingual Plane (BMP) pot fi stocate de către onchar " sau " nvarchar teren. Cu toate acestea, nu este cazul ca orice ** de caractere Unicode pot fi stocate. De exemplu, conform Wikipedia, codul puncte pentru hieroglife Egiptene se încadrează în BMP. Există, prin urmare, siruri de caractere Unicode care pot fi reprezentate în UTF-8 și alte adevărat Unicode codificări care nu pot fi stocate într-un Server SQL `nchar " sau " nvarchar teren, și siruri de caractere scris în hieroglife Egiptene ar fi printre ei. Din fericire, utilizatorii dvs., probabil, nu't scrie în scenariu, dar's ceva de a păstra în minte!

Un alt confuz, dar punct de vedere interesant că alte postere au subliniat este că char și varchar domenii pot utiliza doi octeți pe caracter pentru anumite caractere, dacă colaționarea pagina de cod necesită. (Martin Smith oferă un excelent exemplu în care el arată cum Chinese_Traditional_Stroke_Order_100_cs_as_ks_ws prezintă acest comportament. A verifica it afară.)

ACTUALIZARE: Ca de SQL Server 2012, sunt în cele din urmă pagini de cod pentru UTF-16, de exemplu Latin1_General_100_CI_AS_SC, care poate cu adevărat să acopere întreaga gamă Unicode.

Comentarii (0)
  • char: lungime fixă datele de caractere cu o lungime maximă de 8000 de caractere.
  • nchar: lungime fixă de date unicode, cu o lungime maximă de 4000 de caractere.
  • Char = 8 biți lungime
  • NChar = 16 biți lungime
Comentarii (1)

nchar[(n)] (caracter național)

  • De lungime fixă Unicode date șir de caractere.
  • "n" definește lungimea șirului de caractere și trebuie să fie o valoare de la 1 la 4.000 de.
  • Dimensiunea de stocare este de două ori `n bytes.

nvarchar [(n | max)] (national caractere diferite.)

  • Lungime variabilă Unicode date șir de caractere.
  • "n" definește șirul de lungime și poate avea o valoare de la 1 la 4.000 de.
  • "max." indică faptul că dimensiunea maximă de stocare este de 2^31-1 bytes (2 GB).
  • Depozitarea dimensiunea, în octeți, este de două ori lungimea efectivă a datelor introduse + 2 bytes

char [(n)] (caracter)

  • De lungime fixă, non-Unicode de date șir de caractere.
  • "n" definește lungimea șirului de caractere și trebuie să fie o valoare de la 1 la 8.000 de.
  • Dimensiunea de stocare este de " n " biți.

varchar [(n | max)] (caractere diferite)

  • Lungime variabilă, non-Unicode date șir de caractere.
  • "n" definește șirul de lungime și poate avea o valoare de la 1 la 8.000 de.
  • "max." indică faptul că dimensiunea maximă de stocare este de 2^31-1 bytes (2 GB).
  • Dimensiunea de stocare este lungimea efectivă a datelor introduse + 2 bytes.
Comentarii (0)

nchar necesită mai mult spațiu decât nvarchar.

de exemplu,

Un char(100) va stoca întotdeauna de 100 de caractere, chiar dacă introduceți doar 5, restul de 95 de caractere va fi căptușit cu spații. Stocarea 5 caractere într-un varchar(100) va salva de 5 caractere.

Comentarii (1)

Diferențele sunt:

  1. n[var]char magazine unicode în timp ce [var]char magazine single-byte de caractere.
  2. [n]char necesită un număr fix de caractere din lungimea exactă în timp ce [n]varchar acceptă un număr variabil de caractere până la și inclusiv definit lungime.

O altă diferență este lungimea. Ambele nchar și nvarchar poate fi de până la 4000 de caractere. Și char și varchar poate fi de până la 8000 de caractere. Dar pentru SQL Server, puteți utiliza, de asemenea, o [n]varchar(max), care poate suporta până la 2,147,483,648 caractere. (Doi gigabytes, semnat de 4-byte integer.)

Comentarii (0)

nchar(10) este o lungime fixă Unicode string de lungime 10. nvarchar(10) este de o lungime variabilă șir Unicode cu o lungime maximă de 10. De obicei, ar trebui să utilizați fostul cazul în care toate valorile datelor sunt de 10 caractere și acesta din urmă dacă lungimile pot varia.

Comentarii (1)
  • nchar este de lungime fixă și poate conține caractere unicode. acesta utilizează doi octeți pentru fiecare caracter.

  • varchar este de lungime variabilă și nu poate deține caractere unicode. acesta utilizează un byte pentru fiecare caracter.

Comentarii (3)

NVARCHAR poate stoca caractere Unicode și are 2 octeți pe caracter.

Comentarii (3)