Sql-server - Care este diferența dintre char, nchar, varchar și nvarchar în serverul sql

Doar clarificați. sau să rezumă.

  • nchar și nvarchar pot stoca caractere Unicode.
  • char și varchar nu pot stoca caractere Unicode.
  • char și nchar lungime fixă, care va rezerva spațiu de stocare pentru suma pe care o specificați, chiar dacă nu utilizați tot acest spațiu.
  • varchar și nvarchar, care vor folosi doar spații pentru caracterele pe care le stocați. Nu stochează stocarea, de exemplu, char sau nchar.

nchar și nvarchar vor ocupa de două ori mai mult spațiu de stocare, deci ar fi prudent să le folosiți numai dacă aveți nevoie de suport Unicode.







răspuns dat Brian Kim 04 Oct. '17 la ora 18:50

char și varchar nu sunt destinate să stocheze Unicode, dar cu unele trucuri suplimentare de codificare și logică suplimentară, puteți utiliza în continuare câmpul char [var] pentru a stoca unicode. - Wim ten Brink 04 Oct. '17 la ora 18:50

Depinde dacă versiunea n este disponibilă. ia de două ori spațiul de stocare după cum arată răspunsul meu - Martin Smith 04 octombrie. '17 la ora 18:50

Care este avantajul rezervării stocării? - mlissner Oct 04 '17 la ora 18:50

În ultimul paragraf: Unicode NCHAR și Cu ajutorul nvarchar în cele mai multe cazuri, este mai bine, comparații îmbunătățirea, flexibilitate pentru utilizatorii elimină problemele de compatibilitate viitoare. Și apropo, spațiul de stocare nu este o problemă în acest caz, deoarece utilizarea de acest fel, fără Unicode - aceasta este o mulțime de probleme, și în viitor, cantitatea de memorie va continua să scadă - Jaison Varghese 04 octombrie. '17 la ora 18:50

De fapt, orice char / varchar sau NCHAR / nvarchar nu poate stoca întreaga gamă de caractere Unicode, astfel încât să puteți fi greșit să spunem că puteți stoca caractere Unicode, iar celălalt - nr. Fix de caractere dublu-byte (SQL Server utilizează codificarea de caractere numit UCS-2 pentru NCHAR și nvarchar) nu este suficient de mare pentru a acoperi întreaga gamă de Unicode. Consultați Răspunsul meu pentru mai multe detalii. - PeterAllenWebb 04 Oct. '17 la ora 18:50

+1 dacă toate acestea sunt adevărate - kta 04 oct. '17 la ora 18:50

Cu toate acestea, pentru [n] varchar, puteți stoca șiruri de lungime fixă, dacă doriți, de exemplu varchar (20). Care este diferența dintre char (20) și varchar (20)? - Ben Caine 04 Oct. '17 la ora 18:50

@BenCaine char (20) va folosi 20 de octeți (cu condiția de sortare pe 8 biți); varchar (20) va folosi len (date) +2 octeți, adică 22 pentru 20 de octeți de date, dar numai 12 pentru 10 octeți de date. Cele două octeți suplimentare sunt înregistrările de lungime. Dacă datele dvs. sunt întotdeauna de lungime, utilizați simbolul deoarece economisește spațiu și poate fi mai rapid. Vă rugăm să nu folosiți niciodată varchar (1), sau chiar mai puțin decât varchar (4). Un caracter în format varchar folosește trei octeți, deci char (3) nu va folosi niciodată mai mult spațiu decât varchar (3). - Richard Gadsden 04 octombrie '17 la ora 18:50

@RichardGadsden Linia goală varchar (3) ocupă mai puțin spațiu decât șirul gol char (3)? 2 octeți vs. 3 octeți? - andrewb 04 Oct. '17 la ora 18:50

@andrewb este tehnic, dar de obicei aveți un zero, care nu este un octet deloc. - Richard Gadsden 04 octombrie '17 la ora 18:50

Singurul caz pe care le-ar face, este că, atunci când încercați să migrați datele din program (de exemplu, asp.net api web) în SQL Server, și aveți un set de coloane pentru char, acesta va permite să actualizați sau introduceți orice curent în el. Dacă acest lucru este greșit sau încă se poate spune că trece un șir unui personaj. Un exemplu este un câmp „StateAbbrv char (2)“ și anexa serverul public String StateAbbrv. - Edward 04 Oct. '17 la ora 18:50







Încercarea mea de a generaliza și corecta răspunsurile existente:

În primul rând, char și NCHAR va folosi întotdeauna o cantitate fixă ​​de spațiu de memorie, chiar dacă șirul pe care doriți să salvați, mai puțin spațiu disponibil, în timp ce varchar și nvarchar va utiliza numai aceeași cantitate de spațiu de stocare necesar pentru a stoca acest șir (plus doi octeți de deasupra capului date, probabil pentru a stoca lungimea șirului). Deci, amintiți-vă că "var" înseamnă "variabilă", ca într-un spațiu variabil.

Al doilea punct important să se înțeleagă că este NCHAR și stoca nvarchar siruri de caractere, folosind exact doi octeți per caracter, în timp ce char si varchar utilizează codificarea definită prin sortarea pagina de cod, care va fi, de obicei, exact un octet pentru fiecare caracter (deși există excepții, a se vedea mai jos). Folosind doi octeți per caracter, puteți stoca o gamă foarte largă de caractere, astfel încât principalul lucru de reținut aici este că NCHAR și nvarchar sunt o alegere mult mai bine dacă doriți să sprijine internaționalizarea, probabil faci.

Acum pentru câteva puncte mai subțiri.

În primul rând, coloanele nchar și nvarchar stochează întotdeauna datele utilizând UCS-2. Acest lucru înseamnă că va fi folosit exact doi octeți per caracter și orice caracter Unicode pe plan bază multilingvă (BMP) pot fi stocate în NCHAR sau câmpul nvarchar. Cu toate acestea, orice caracter Unicode nu poate fi salvat. De exemplu, în conformitate cu Wikipedia, punctele de cod pentru hieroglife egiptene depășesc BMP-ul. Astfel, siruri de caractere Unicode pot fi reprezentate în codificarea UTF-8 și alte Unicode adevărate, care nu pot fi stocate în NCHAR SQL Server sau nvarchar. iar liniile scrise în hieroglife egiptene vor fi printre ele. Din fericire, utilizatorii dvs. probabil nu scriu în acest script, dar trebuie să vă amintiți acest lucru!

răspuns oferit de PeterAllenWebb 04 Oct. '17 la ora 18:50

  • char. caractere de lungime fixă ​​cu o lungime maximă de 8000 de caractere.
  • NCHAR. Datele unicode de lungime fixă, cu o lungime maximă de 4000 de caractere.
  • = lungime 8 biți
  • = Lungime de 16 biți

răspunsul este dat de ss. Octombrie 04 '17 la ora 18:50

nchar are o lungime fixă ​​și poate conține caractere unicode. folosește două magazine de octeți pentru fiecare caracter.

varchar este variabilă în lungime și nu poate conține caractere Unicode. folosește o memorie de octet pentru fiecare caracter.

răspuns dat Manu 04 oct. '17 la ora 18:50

Greșită. Unicode poate utiliza de la 1 la 4 octeți (în general) pentru fiecare caracter. În plus, varchar poate conține unicode, dar nu este recunoscut ca unicode. Ca rezultat, varchar este considerat nesigur pentru a stoca unicode. (În plus, există riscul ca codul care accesează câmpul să nu o traducă corect). - Wim ten Brink 04 Oct. '17 la ora 18:50

@Alex: Cred că ți-ai exprimat punctul de vedere, dar încă nu sunt de acord cu tine. Ce spui, este ceea ce ține un int lung CAN, în cazul în care dimensiunea lungă este mai mică de 2 ^ 32, este nu numai „nesigure“, este o limitare inerentă, ceea ce face imposibilă pentru a acoperi întreaga gamă de valori. - Manu 04 Oct. '17 la ora 18:50

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

răspuns dat Gustavo Rubio 04 Oct. '17 la ora 18:50

Gresit! Unicode utilizează 1 până la 4 octeți per caracter! Mulți uită de asta! Chiar și utilizarea UTF-16 poate cauza ca unele caractere să ia 4 octeți în loc de 2, deși lungimea totală este de 2 octeți. Unele alte subformate Unicode pot ocupa mai mult de 4 octeți! - Wim ten Brink 04 Oct. '17 la ora 18:50

@WimtenBrink - Întrebarea despre SQL Server și nvarchar ia întotdeauna 2 octeți pe caracter. - Martin Smith Octombrie 04 '17 la ora 18:50

  • Dimensiunea depozitului este de n octeți.
  • Sinonimul ISO pentru simbol este un simbol.

Am obținut o concluzie. Pentru că nu am specificat o lungime pentru char. Acesta va ocupa lungimea prestabilită de 1.

  • Date despre șir de lungime variabilă, nu Unicode.
  • n determină lungimea șirului și poate fi o valoare de la 1 la 8000.
  • max indică faptul că dimensiunea maximă de stocare este de 2 ^ 31-1 octeți (2 GB).
  • Dimensiunea de stocare este lungimea reală a datelor introduse + 2 octeți.
  • Sinonime ISO pentru varchar au un caracter sau un caracter diferit.
  • Unicode șir de date cu o lungime fixă.
  • n determină lungimea șirului și trebuie să fie o valoare de la 1 la 4000.
  • Sinonime ISO pentru nchar este un simbol național și un caracter național.

nvarchar [(n | max)]

  • Dungă variabilă a lungimii variabilei Unicode.
  • n determină lungimea șirului și poate fi o valoare de la 1 la 4000.
  • max indică faptul că dimensiunea maximă de stocare este de 2 ^ 31-1 octeți (2 GB).
  • Sinonimele ISO pentru nvarchar au un caracter național și un caracter național diferit.

Răspunsul dat de vikram reddy 04 Oct. '17 la ora 18:50







Trimiteți-le prietenilor: