Este doar că nvarchar acceptă caractere multioctet? Dacă acesta este cazul, există într-adevăr orice punct, altul decât preocupările de stocare, folosind
varchars`?
O nvarchar
coloana poate stoca orice date Unicode. O varchar
coloana este limitată la un 8-bit codepage. Unii oameni cred că varchar
ar trebui să fie utilizat, deoarece este nevoie de mai puțin spațiu. Cred că acest lucru nu este răspunsul corect. Codepage incompatabilities sunt o durere, și Unicode este leacul pentru codepage probleme. Cu zboruri ieftine disk și de memorie în zilele noastre, există într-adevăr nici un motiv să pierdeți timpul aiurea cu codul pagini mai.
Toate sistemele de operare moderne și a platformelor de dezvoltare a folosi Unicode pe plan intern. Prin utilizarea nvarchar "mai degrabă decât" varchar
, poți evita să faci codare conversii de fiecare dată când citesc sau scriu date. Conversii lua timp, și sunt predispuse la erori. Și de recuperare din erori de conversie este un non-trivial problema.
Dacă sunteți de interfațare cu o aplicație care utilizează numai ASCII, as recomanda totusi folosirea Unicode în baza de date. OPERARE și de colaționare de date algoritmi va lucra mai bine cu Unicode. Unicode evită probleme de conversie atunci când interfațare cu alte ** sisteme. Și te va pregăti pentru viitor. Și puteți valida întotdeauna că datele dumneavoastră este limitat la 7-bit ASCII pentru orice sistem moștenire te're a fi nevoie să se mențină, chiar și în timp ce se bucură de unele dintre beneficiile de Unicode complet de stocare.
varchar: lungime Variabilă, non-Unicode caracter. Baza de date colaționare determină care codul paginii datele sunt stocate folosind.
nvarchar: lungime Variabilă de date de caractere Unicode. Depinde de colaționare de date pentru comparații.
Înarmat cu această cunoaștere, utilizați oricare meciuri de datele de intrare (ASCII v. Unicode).
Eu folosesc întotdeauna nvarchar deoarece permite orice am'm clădirii pentru a rezista destul de mult orice date arunca la ea. Mi CMS sistemul Chinez de accident, pentru că am folosit nvarchar. În aceste zile, orice noi aplicații ar trebui't într-adevăr să fie în cauză cu suma de spațiul necesar.
Aceasta depinde de modul în Oracle a fost instalat. În timpul procesului de instalare, de NLS_CHARACTERSET opțiune este setată. Ați putea fi capabil de a găsi cu interogarea SELECTAȚI valoarea$ DIN sys.recuzita$ A name = 'NLS_CHARACTERSET'
.
Dacă NLS_CHARACTERSET este o codificare Unicode ca UTF8, mare. Folosind VARCHAR și NVARCHAR sunt aproape identice. Opri din citit acum, du-te pentru ea. În caz contrar, sau dacă aveți nici un control asupra Oracle set de caractere, citiți mai departe.
VARCHAR — Datele sunt stocate în NLS_CHARACTERSET codare. Dacă există și alte instanțe de baze de date pe același server, este posibil să fie restricționat prin ele; și invers, când trebuie să împartă setarea. Un astfel de câmp poate stoca orice date care pot fi codificate folosind setul de caractere, și nimic altceva. Astfel, de exemplu, dacă setul de caractere este MS-1252, puteți stoca doar caractere, cum ar fi litere limba engleză, un pumn de litere accentuate, și câteva altele (cum ar fi euro și —). Cererea dumneavoastră ar fi util numai pentru câteva localizări, în imposibilitatea de a opera oriunde altundeva în lume. Pentru acest motiv, se consideră că este O Idee Proastă.
NVARCHAR — Datele sunt stocate într-o codificare Unicode. Fiecare limbă este acceptată. O Idee Bună.
Ce zici de spațiu de stocare? VARCHAR este, în general, eficient, deoarece setul de caractere / codare a fost personalizat-proiectat pentru o anumită localizare. NVARCHAR câmpuri magazin, fie în UTF-8 sau UTF-16 codare de bază, pe NLS setare destul de ironic. UTF-8 este foarte eficient pentru "Vest" limbi, în timp ce încă sprijinirea limbi Asiatice. UTF-16 este foarte eficient pentru limbi Asiatice, în timp ce încă de sprijin "Vest" limbi. Dacă în cauză cu privire la spațiul de stocare, alege o NLS setare pentru a provoca Oracle să folosească UTF-8 sau UTF-16, după caz.
Ce zici de viteza de procesare? Cele mai noi platforme de codificare a folosi Unicode nativ (Java, .NET, chiar C++ std::wstring de ani în urmă!) deci, dacă câmpul bază de date este VARCHAR forțele de Oracle pentru a converti intre seturi de caractere pe fiecare să citească sau să scrie, nu asa de bine. Folosind NVARCHAR evită conversie.
Linia de fund: Utilizarea NVARCHAR! Se evită limitările și dependențe, este bine pentru spațiu de stocare, și, de obicei, cele mai bune performanțe pentru prea.
nvarchar stochează datele ca Unicode, deci, dacă aveți de're de gând pentru a stoca date multilingve (mai mult de o singură limbă) într-o coloană de date ai nevoie de N varianta.
Cei doi cenți ai mei
Indici poate eșua atunci când nu utilizați corect tipuri de date:
În SQL Server: Când au un indice de peste un VARCHAR coloană și să prezinte un Șir Unicode, SQL Serverul nu face uz de index. Același lucru se întâmplă atunci când prezintă un BigInt la un indexat-o coloană conțin SmallInt. Chiar dacă BigInt este suficient de mic pentru a fi un SmallInt, SQL Serverul nu este capabil de a utiliza index. Invers nu am aceasta problema (atunci când furnizează SmallInt sau Ansi-Cod pentru un indexate BigInt ot NVARCHAR coloana).
Tipuri de date pot varia între diferite baze de date's de Date (database Management System):
Știu că fiecare bază de date are ușor diferite tipuri de date și VARCHAR nu înseamnă același peste tot. În timp ce SQL Server a VARCHAR și NVARCHAR, Apache/Derby-ul de baze de date are doar VARCHAR și acolo VARCHAR este în Unicode.
În principal, nvarchar magazine de caractere Unicode și varchar magazine non-Unicode caractere.
"Unicodes" înseamnă 16-bit personaj sistem de codificare care permite personaje dintr-o mulțime de alte limbi, cum ar fi arabă, ebraică, Chineză, Japoneză, să fie codificate într-un singur set de caractere.
Asta înseamnă că unicodes se folosesc 2 octeți pe caracter pentru a stoca și nonunicodes foloseste numai un octet pentru fiecare caracter la magazin. Ceea ce înseamnă unicodes nevoie de dubla capacitatea de a stoca în comparație cu non-unicodes.
Aș spune, depinde.
Dacă vă dezvolta o aplicație desktop, în cazul în care sistemul de OPERARE funcționează în Unicode (la fel ca toate sistemele de operare Windows actuale) și are limbajul nativ suport Unicode (implicit siruri de caractere sunt Unicode, cum ar fi în Java sau C#), apoi du-te nvarchar.
Dacă vă dezvolta o aplicație web, în cazul în care siruri de caractere veni ca UTF-8, și limba este PHP, care încă nu are suport Unicode nativ (în versiuni 5.x), atunci varchar va fi, probabil, o alegere mai bună.
Te're dreptate. nvarchar
stochează date Unicode în timp ce varchar
magazine single-byte de caractere de date. De depozitare, altele decât diferențe (nvarchar
necesită de două ori spațiul de stocare ca varchar
), care te-a menționat deja, principalul motiv pentru preferând nvarchar "peste" varchar
ar fi internaționalizare (de exemplu, stocarea siruri de caractere în alte limbi).
Deși NVARCHAR
magazine Unicode, tu ar trebui să ia în considerare cu ajutorul colaționare, de asemenea, puteți utiliza VARCHAR
și de a salva datele dumneavoastră de limbi locale.
Imaginați-vă următorul scenariu.
Colaționarea de DB este persan și a salva o valoare ca 'علی' (persan scris de Ali) in anii VARCHAR(10)
de date. Nu există nici o problemă și SGBD folosește doar trei octeți pentru a stoca.
Cu toate acestea, dacă doriți să transferați date în altă bază de date și a vedea rezultatul corect destinație de date trebuie să aibă aceeași colaționare ca țintă, care este persan în acest exemplu.
Dacă ținta ta de colaționare este diferit, veți vedea unele semne de întrebare(?) în baza de date țintă.
În cele din urmă, amintiți-vă, dacă utilizați o bază de date uriașă, care este pentru utilizare de limba locală, mi-ar recomanda pentru a utiliza locația în loc de a folosi prea multe spații.
Cred că designul poate fi diferit. Aceasta depinde de mediul de lucru pe.
Am avut o privire la răspunsurile și mulți par să recomande utilizarea nvarchar "peste" varchar
, pentru că spațiul nu mai este o problemă, astfel încât nu există nici un rău în a permite Unicode pentru puțin spațiu de stocare suplimentar. Ei bine, acest lucru nu este întotdeauna adevărat, atunci când doriți să se aplice un index pe coloana ta. SQL Server are o limita de 900 bytes pe dimensiunea câmpului puteți index. Deci, dacă aveți o varchar(900)
încă mai poți index, dar nu varchar(901)
. Cu nvarchar, numărul de personaje este redus la jumătate, astfel încât să puteți indicele de până la
nvarchar(450). Deci, dacă nu sunteți sigur că don't nevoie de nvarchar
, nu't recomandăm să utilizați-l.
În general, în bazele de date, vă recomandăm lipit la dimensiunea care aveți nevoie, pentru că puteți extinde mereu. De exemplu, un coleg de la locul de muncă o dată crezut că nu există nici un rău în utilizarea nvarchar(max) pentru o coloana, ca nu avem nici o problemă cu depozitarea la toate. Mai târziu, când am încercat să aplice un indice peste această coloană, SQL Server a respins acest lucru. Dacă, cu toate acestea, el a început chiar cu
varchar(5)`, am putea pur și simplu au extins mai târziu la ceea ce am nevoie, fără o astfel de problemă care ne va obliga să facem un teren plan de migrare pentru a rezolva această problemă.
Dacă un singur octet este utilizat pentru a stoca un personaj, există 256 de combinații posibile, și astfel puteți salva 256 caractere diferite. Colaționare este modelul care definește personajele și normele prin care sunt comparate și clasificate în funcție.
1252, care este Latin1 (ANSI), este cel mai comun. Single-byte seturi de caractere sunt, de asemenea, inadecvată pentru a stoca toate caracterele utilizate de către mai multe limbi. De exemplu, unele limbi Asiatice au mii de caractere, astfel încât acestea trebuie să utilizați două octeți pe caracter.
Atunci când sistemele folosind mai multe pagini de cod sunt utilizate într-o rețea, devine dificil de a gestiona comunicarea. Pentru a standardiza lucruri, ISO și Unicode consortium introdus Unicode. Unicode utilizează doi octeți pentru a stoca fiecare personaj. Care este 65.536 de caractere diferite pot fi definite, așa că aproape toate personajele pot fi acoperite cu Unicode. Dacă două calculatoare folosesc Unicode, fiecare simbol va fi reprezentat în același mod și nici de conversie este necesar - aceasta este ideea din spatele Unicode.
SQL Server are două categorii de tipuri de date caracter:
Dacă avem nevoie pentru a salva datele de caractere din mai multe țări, folosiți întotdeauna Unicode.
Principala diferență între `Varchar(n) " și " nvarchar(n) este:
Varchar
( de lungime Variabilă, non-Unicode caracter) dimensiunea este de pana la 8000.
1.Este un tip de date de lungime variabilă
Utilizat pentru a stoca non-Unicode caractere
Ocupă 1 octet de spațiu pentru fiecare personaj
Nvarchar
:lungime Variabilă de date de caractere Unicode.
1.Este o de date de lungime variabilă de tip
2.Utilizat pentru a stoca caractere Unicode.
Urmați Diferența Între Sql Server VARCHAR și NVARCHAR Tip de Date. Aici ai putea vedea într-o foarte descriptiv.
În generalnvarchar stochează datele ca Unicode, deci, dacă aveți de're de gând pentru a stoca date multilingve (mai mult de o singură limbă) într-o coloană de date ai nevoie de N varianta.
Trebuie să spun aici (îmi dau seama că m-am'm, probabil, de gând să mă deschid un slating!), dar, cu siguranță, singura dată când NVARCHAReste, de fapt, *mai mult* utile (observați *mai mult* acolo!) decât
VARCHAReste atunci când toate colaționări pe toate depind de sisteme și în baza de date în sine sunt la fel...? Dacă nu, atunci de colaționare de conversie trebuie să se întâmple oricum și așa face
VARCHARla fel de viabilă ca
NVARCHAR`.
Pentru a adăuga la aceasta, unele sisteme de baze de date, precum SQL Server (înainte de 2012) au o dimensiune de pagină de aprox. 8K. Deci, dacă te're în căutarea de la stocarea de date, nu a avut loc în ceva ca un TEXT " sau " NTEXT câmpul apoi
VARCHARoferă din plin 8k's valoare de spațiu întrucât
NVARCHAR` oferă doar 4k (dublu bytes, dublu spațiu).
Presupun că, pentru a rezuma, utilizarea fie a este dependentă de:
Jeffrey Am Balle cu ~47000 scor de reputație recomandă utilizarea de nvarchar
Solomon Rutzky cu cu ~33200 scor de reputație recomandă: NU utilizați întotdeauna NVARCHAR. Asta este foarte periculos, și de multe ori costisitoare, atitudine / abordare.
https://www.sqlservercentral.com/articles/disk-is-cheap-orly-4
Ambele persoane de astfel de o mare reputație, ceea ce înseamnă o învățare de bază de date sql server developer alege?
Există multe avertismente în răspunsuri și comentarii cu privire la probleme de performanță dacă nu sunteți consecvent în alegeri.
Nu sunt comentarii pro/con nvarchar pentru performanță.
Nu sunt comentarii pro/con varchar pentru performanță.
Am o anumită cerință pentru o masa cu mai multe sute de coloane, care, în sine este, probabil, neobișnuit ?
Am'm alegerea varchar pentru a evita merge aproape la 8060 octet înregistrare de masă limita de dimensiune de SQL*server 2012.
Utilizarea nvarchar, pentru mine, a trecut peste acest 8060 octet limita.
Am'm, de asemenea, gândindu-mă că ar trebui să se potrivesc cu tipurile de date legate de tabele de coduri pentru tipuri de date de primar masă centrală.
Am văzut utilizarea varchar coloana la acest loc de muncă, la Sud de Guvernul Australian, de experiență anterioare dezvoltatorii de baze de date, în cazul în care tabelul de numărul de rând este de gând să fie de mai multe milioane sau mai mult (și foarte puțini nvarchar coloane, dacă este cazul, în aceste tabele mari), astfel încât, probabil, de așteptat de date rând volumele devine parte integrantă din prezenta decizie.
nvarchar
este sigur de a utiliza în comparație cu varchar
în scopul de a face nostru cod de eroare gratuit (de tip nepotrivite) pentru că nvarchar
permite caractere unicode, de asemenea,.
Când ne-am folosi "unde" starea în SQL Server query și dacă suntem folosind =
operator, se va arunca o eroare de câteva ori. Probabil motivul pentru acest lucru este nostru de cartografiere coloană va fi difined în varchar
. Dacă am definit-o în nvarchar asta problema mea nu se intampla. Încă rămânem la
varcharși pentru a evita această problemă vom folosi mai bine "CA și" cuvânt-cheie, mai degrabă decât
=`.