Wat is het verschil tussen VARCHAR en NVARCHAR?

Is het alleen dat nvarcharondersteunt multibyte-personages? Als dat het geval is, is er echt elk punt, anders dan opslagcellen, om varcharste gebruiken?


1, Autoriteit 100%

Een nvarcharColumn kan alle Unicode-gegevens opslaan. Een varcharkolom is beperkt tot een 8-bits codepagina. Sommige mensen denken dat varcharmoet worden gebruikt omdat het minder ruimte in beslag neemt. Ik geloof dat dit niet het juiste antwoord is. CODEPAGE-incompatibiliteit zijn pijn en Unicode is de remedie voor codepaginaproblemen. Met goedkope schijf en geheugen Tegenwoordig is er echt geen reden om tijd meer met CODE-pagina’s te verspillen.

Alle moderne besturingssystemen en ontwikkelingsplatforms gebruiken intern unicode. Door nvarcharte gebruiken in plaats van varchar, kunt u voorkomen dat u codering van conversies gebruikt telkens wanneer u van of de database leest of moet schrijven. Conversies nemen tijd en zijn vatbaar voor fouten. En herstel van conversiefouten is een niet-triviaal probleem.

Als u interfacing met een applicatie die alleen ASCII gebruikt, zou ik nog steeds aanbevelen om Unicode in de database te gebruiken. Het besturingsalgoritmen van OS en database zullen beter werken met Unicode. Unicode vermijdt conversieproblemen bij het interfacing met Andere -systemen. En je bereidt zich voor op de toekomst. En u kunt altijd valideren dat uw gegevens beperkt zijn tot 7-bit ASCII voor het enige niveau dat u hoeft te onderhouden, zelfs tijdens het genieten van enkele van de voordelen van volledige Unicode-opslag.


2, Autoriteit 15%

varchar : variabele lengte , niet-Unicode-tekengegevens. De database-collatie bepaalt welke codepagina de gegevens worden opgeslagen met behulp van.

nvarchar: variabele lengte Unicode-tekengegevens. Afhankelijk van de databasesortering voor vergelijkingen.

Gebruik deze kennis die overeenkomt met uw invoergegevens (ASCII v. Unicode).


Antwoord 3, autoriteit 4%

Ik gebruik altijd nvarchar omdat het toestaat dat alles wat ik bouw, bestand is tegen vrijwel alle gegevens die ik erop gooi. Mijn CMS-systeem doet per ongeluk Chinees, omdat ik nvarchar heb gebruikt. Tegenwoordig hoeven nieuwe applicaties zich niet echt druk te maken over de hoeveelheid benodigde ruimte.


Antwoord 4, autoriteit 2%

Het hangt af van hoe Oracle is geïnstalleerd. Tijdens het installatieproces wordt de optie NLS_CHARACTERSET ingesteld. Je kunt het misschien vinden met de query SELECT value$ FROM sys.props$ WHERE name = 'NLS_CHARACTERSET'.

Als je NLS_CHARACTERSET een Unicode-codering is zoals UTF8, prima. Het gebruik van VARCHAR en NVARCHAR zijn vrijwel identiek. Stop nu met lezen, ga ervoor. Anders, of als je geen controle hebt over de Oracle-tekenset, lees dan verder.

VARCHAR — Gegevens worden opgeslagen in de NLS_CHARACTERSET-codering. Als er andere database-instances op dezelfde server staan, kunt u hierdoor worden beperkt; en vice versa, aangezien u de instelling moet delen. Een dergelijk veld kan alle gegevens opslaan die kunnen worden gecodeerd met die tekenset, en niets anders. Als de tekenset bijvoorbeeld MS-1252 is, kunt u alleen tekens opslaan zoals Engelse letters, een handvol letters met accenten en een paar andere (zoals € en —). Uw toepassing zou alleen nuttig zijn voor een paar landen, die nergens anders ter wereld kunnen worden gebruikt. Om deze reden wordt het beschouwd als een slecht idee.

NVARCHAR — Gegevens worden opgeslagen in een Unicode-codering. Elke taal wordt ondersteund. Een goed idee.

Hoe zit het met opslagruimte? VARCHAR is over het algemeen efficiënt, omdat de tekenset / codering op maat is ontworpen voor een specifieke landinstelling. NVARCHAR-velden worden opgeslagen in UTF-8- of UTF-16-codering, ironisch genoeg gebaseerd op de NLS-instelling. UTF-8 is zeer efficiënt voor “westerse” talen, terwijl het nog steeds Aziatische talen ondersteunt. UTF-16 is zeer efficiënt voor Aziatische talen, terwijl het nog steeds “westerse” talen ondersteunt. Als u zich zorgen maakt over opslagruimte, kiest u een NLS-instelling om ervoor te zorgen dat Oracle UTF-8 of UTF-16 gebruikt.

Hoe zit het met de verwerkingssnelheid? De meeste nieuwe coderingsplatforms gebruiken native Unicode (Java, .NET, zelfs C++ std::wstring van jaren geleden!) Dus als het databaseveld VARCHAR is, dwingt het Oracle om tussen tekensets te converteren bij elke lees- of schrijfbewerking, niet zo goed. Het gebruik van NVARCHAR vermijdt de conversie.

Kortom: gebruik NVARCHAR! Het vermijdt beperkingen en afhankelijkheden, is prima voor opslagruimte en meestal ook het beste voor prestaties.


Antwoord 5

nvarchar slaat gegevens op als Unicode, dus als u meertalige gegevens (meer dan één taal) in een gegevenskolom wilt opslaan, hebt u de N-variant nodig.


Antwoord 6

Mijn twee cent

  1. Indexen kunnen mislukken als de juiste gegevenstypen niet worden gebruikt:
    In SQL Server: wanneer u een index over een VARCHAR-kolom hebt en deze een Unicode-string presenteert, maakt SQL Server geen gebruik van de index. Hetzelfde gebeurt wanneer u een BigInt presenteert aan een geïndexeerde kolom die SmallInt bevat. Zelfs als de BigInt klein genoeg is om een SmallInt te zijn, kan SQL Server de index niet gebruiken. Omgekeerd heb je dit probleem niet (bij het verstrekken van SmallInt of Ansi-Code aan een geïndexeerde BigInt of NVARCHAR-kolom).

  2. Datatypes kunnen variëren tussen verschillende DBMS’s (DataBase Management System):
    Weet dat elke database iets andere datatypes heeft en dat VARCHAR niet overal hetzelfde betekent. Terwijl SQL Server VARCHAR en NVARCHAR heeft, heeft een Apache/Derby-database alleen VARCHAR en daar zit VARCHAR in Unicode.


Antwoord 7

Voornamelijk nvarcharslaat Unicode-tekens op en varcharslaat niet-Unicode-tekens op.

‘Unicodes’ betekent een 16-bits tekencoderingsschema waarmee tekens uit tal van andere talen, zoals Arabisch, Hebreeuws, Chinees en Japans, in één enkele tekenset kunnen worden gecodeerd.

Dat betekent dat unicodes 2 bytes per teken gebruikt om op te slaan en niet-unicodes gebruikt slechts één byte per teken om op te slaan. Dat betekent dat unicodes dubbele opslagcapaciteit nodig hebben in vergelijking met niet-unicodes.


Antwoord 8

Je hebt gelijk. nvarcharslaat Unicode-gegevens op terwijl varcharenkelbyte-tekengegevens opslaat. Afgezien van de opslagverschillen (nvarcharvereist twee keer zoveel opslagruimte als varchar), die u al noemde, is de belangrijkste reden om nvarcharte verkiezen boven varcharzou internationalisering zijn (dwz strings in andere talen opslaan).


Antwoord 9

Ik zou zeggen, het hangt ervan af.

Als u een desktoptoepassing ontwikkelt, waarbij het besturingssysteem in Unicode werkt (zoals alle huidige Windows-systemen) en de taal standaard Unicode ondersteunt (standaardreeksen zijn Unicode, zoals in Java of C#), ga dan voor nvarchar.

Als je een webtoepassing ontwikkelt, waar strings binnenkomen als UTF-8, en de taal PHP is, die nog steeds geen native Unicode ondersteunt (in versies 5.x), dan is varchar waarschijnlijk een betere keuze.

p>


Antwoord 10

Hoewel nvarcharUnicode opslaat, zou u met behulp van sortering ook moeten overwegen om varcharte gebruiken en uw gegevens van uw lokale talen op te slaan.

Stel je het volgende scenario eens voor.

De sortering van uw DB is Perzisch en u slaat een waarde op zoals ‘علی’ (Perzisch schrift van Ali) in het gegevenstype VARCHAR(10). Er is geen probleem en het DBMS gebruikt slechts drie bytes om het op te slaan.

Als u uw gegevens echter naar een andere database wilt overbrengen en het juiste resultaat wilt zien, moet uw bestemmingsdatabase dezelfde sortering hebben als het doel dat in dit voorbeeld Perzisch is.

Als uw doelsortering anders is, ziet u enkele vraagtekens (?) in de doeldatabase.

Ten slotte, onthoud dat als je een enorme database gebruikt die bedoeld is voor het gebruik van je lokale taal, ik zou aanraden om locatie te gebruiken in plaats van te veel spaties.

Ik geloof dat het ontwerp anders kan zijn. Het hangt af van de omgeving waarin je werkt.


Antwoord 11

nVarchar helpt u bij het opslaan van Unicode-tekens. Dit is de juiste keuze als u gelokaliseerde gegevens wilt opslaan.


Antwoord 12

Ik heb de antwoorden bekeken en velen lijken aan te bevelen om nvarcharte gebruiken in plaats van varchar, omdat ruimte geen probleem meer is, dus het kan geen kwaad om Unicode voor weinig extra opslagruimte. Welnu, dit is niet altijd waar als u een index op uw kolom wilt toepassen. SQL Server heeft een limiet van 900 bytes op de grootte van het veld dat u kunt indexeren. Dus als je een varchar(900)hebt, kun je deze nog steeds indexeren, maar niet varchar(901). Met nvarcharwordt het aantal tekens gehalveerd, zodat u tot nvarchar(450)kunt indexeren. Dus als je zeker weet dat je nvarcharniet nodig hebt, raad ik het gebruik ervan af.

In het algemeen, in databases, raad ik aan om vast te houden aan de grootte die je nodig hebt, omdat je altijd kunt uitbreiden. Een collega op het werk heeft bijvoorbeeld eenmaal gedacht dat er geen schade is aan het gebruik van nvarchar(max)voor een kolom, omdat we helemaal geen probleem hebben met opslag. Later, toen we probeerden een index over deze kolom toe te passen, verwierp SQL Server dit. Als hij echter begon met zelfs varchar(5), hadden we het eenvoudigweg kunnen uitbreiden naar wat we nodig hebben zonder een dergelijk probleem dat ons nodig heeft om een ​​veldmigratieplan te doen om dit probleem op te lossen.


13

Het belangrijkste verschil tussen Varchar(n)en nvarchar(n)is:

varchar(Variabele lengte, niet-Unicode-tekengegevens) Grootte is tot 8000.
1. Het is een gegevenstype van een variabele lengte

  1. Gebruikt om niet-Unicode-tekens op te slaan

  2. Neemt 1 byte van ruimte in voor elk teken

nvarchar: variabele lengte Unicode-tekengegevens.

1.Het is een gegevenstype van een variabele lengte

2.Gebruikt om Unicode-tekens op te slaan.

  1. Gegevens worden opgeslagen in een unicodecodering. Elk
    taal wordt ondersteund. (bijvoorbeeld de talen Arabisch, Duits, Hindi, enz. Enzovoort)

14

Als een enkele byte wordt gebruikt om een ​​personage op te slaan, zijn er 256 mogelijke combinaties, en daardoor kunt u 256 verschillende karakters besparen. Collatie is het patroon dat de personages en de regels definieert waarmee ze worden vergeleken en gesorteerd.

1252, dat is de Latin1 (ANSI), is het meest gebruikelijk. Single-byte tekensets zijn ook ontoereikend om alle personages op te slaan die door vele talen worden gebruikt. Sommige Aziatische talen hebben bijvoorbeeld duizenden karakters, dus ze moeten twee bytes per karakter gebruiken.

Unicode-standaard

Wanneer systemen met behulp van meerdere codepagina’s worden gebruikt in een netwerk, wordt het moeilijk om communicatie te beheren. Om dingen te standaardiseren, introduceerden het ISO- en Unicode Consortium de Unicode . Unicode gebruikt twee bytes om elk personage op te slaan. Dat is 65.536 verschillende tekens kunnen worden gedefinieerd, dus bijna alle personages kunnen worden bedekt met Unicode. Als twee computers Unicode gebruiken, wordt elk symbool op dezelfde manier weergegeven en is er geen conversie nodig – dit is het idee achter Unicode.

SQL Server heeft twee categorieën tekengegevens:

  • niet-unicode (char, varchar en tekst)
  • Unicode (NCHAR, NVARCHAR, EN NTEXT)

Als we gebruikersgegevens van meerdere landen moeten opslaan, gebruikt u altijd Unicode.


Antwoord 15

Volg Verschil tussen Sql-server VARCHAR en NVARCHAR-gegevenstype. Hier kon je het op een zeer beschrijvende manier zien.

Over het algemeen slaat nvarchar gegevens op als Unicode, dus als u meertalige gegevens (meer dan één taal) in een gegevenskolom wilt opslaan, hebt u de N-variant nodig.


Antwoord 16

Jeffrey L Whitledge met een reputatiescore van ~47000 beveelt het gebruik van nvarchar aan

Solomon Rutzky met een reputatiescore van ~33200 beveelt aan: Gebruik NVARCHAR NIET altijd. Dat is een zeer gevaarlijke en vaak kostbare houding/aanpak.

Wat zijn de belangrijkste prestaties verschillen tussen varchar en nvarchar SQL Server-gegevenstypen?

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

Beide personen met zo’n goede reputatie, wat kiest een lerende SQL Server-databaseontwikkelaar?

Er zijn veel waarschuwingen in antwoorden en opmerkingen over prestatieproblemen als u niet consequent bent in keuzes.

Er zijn opmerkingen pro/con nvarchar voor prestaties.

Er zijn opmerkingen pro/con varchar voor prestaties.

Ik heb een bepaalde vereiste voor een tabel met vele honderden kolommen, wat op zichzelf waarschijnlijk ongebruikelijk is?

Ik kies varchar om te voorkomen dat ik in de buurt kom van de 8060 byte tabelrecordgroottelimiet van SQL*server 2012.

Het gebruik van nvarchar gaat voor mij boven deze limiet van 8060 bytes.

Ik denk ook dat ik de gegevenstypen van de gerelateerde codetabellen moet afstemmen op de gegevenstypen van de primaire centrale tabel.

Ik heb op deze werkplek, de Zuid-Australische regering, het gebruik van de varchar-kolom gezien door eerdere ervaren databaseontwikkelaars, waar het aantal tabelrijen enkele miljoenen of meer zal zijn (en zeer weinig nvarchar-kolommen, indien aanwezig, in deze zeer grote tabellen), dus misschien worden de verwachte gegevensrijvolumes onderdeel van deze beslissing.


Antwoord 17

varcharwordt alleen gebruikt voor non-Unicode characters, aan de andere kant wordt nvarchargebruikt voor beide unicodeen non-unicodetekens. Een ander verschil tussen hen wordt hieronder gegeven.

VARCHAR vs. NVARCHAR

in beslag

VARCHAR NVARCHAR
Type gegevenstype Variabele lengte, niet-Unicode-tekens Variabele lengte, zowel Unicode- als niet-Unicode-tekens, zoals Japans, Koreaans en Chinees.
Maximale lengte Tot 8,000 characters Tot 4,000 characters
Tekengrootte Neemt 1 byteper teken Neemt 2 bytesin beslag per Unicode/niet-Unicode-teken
Opslaggrootte Werkelijke lengte (in bytes) 2 keer de werkelijke lengte (in bytes)
Gebruik Gebruikt wanneer de gegevenslengte variabele of kolommen met variabele lengte is en als de werkelijke gegevens altijd veel minder zijn dan de capaciteit Vanwege de opslag alleen, alleen gebruikt als je Unicode-ondersteuning nodig hebt, zoals de Japanse Kanji- of Koreaanse Hangul-tekens.

Antwoord 18

Sinds SQL Server 2019 ondersteunen varchar-kolommen UTF-8-codering.

Dus vanaf nu is het verschil de grootte.

In een databasesysteem dat zich vertaalt in snelheidsverschil.

Minder formaat = Minder IO + Minder geheugen = Meer snelheid in het algemeen. Lees het artikel hierboven voor de cijfers.

Ga vanaf nu voor varchar in UTF8!

Alleen als u een groot percentageaan gegevens heeft met tekens in het bereik 2048 – 16383 en 16384 – 65535, moet u meten


Antwoord 19

nvarcharis veilig in gebruik in vergelijking met varcharom onze code foutloos te maken (type komt niet overeen) omdat nvarcharook unicode-tekens toestaat .
Wanneer we de voorwaarde wheregebruiken in de SQL Server-query en als we de operator =gebruiken, zal er soms een fout optreden. De waarschijnlijke reden hiervoor is dat onze mappingkolom zal worden onderverdeeld in varchar. Als we het in nvarcharhebben gedefinieerd, kan dit probleem niet voorkomen. Toch houden we ons aan varcharen om dit probleem te vermijden, kunnen we beter het sleutelwoord LIKEgebruiken in plaats van =.

Other episodes