Frage

Ist es nur das? nvarchar unterstützt Multibyte-Zeichen?Wenn dies der Fall ist, hat die Verwendung außer Speicherproblemen wirklich noch einen Sinn? varchars?

War es hilfreich?

Lösung

Eine nvarchar Spalte kann keine Unicode-Daten speichern. Eine varchar Säule wird in einen 8-Bit-Zeichensatz beschränkt. Einige Leute denken, dass varchar verwendet werden soll, weil es weniger Platz in Anspruch nimmt. Ich glaube, dass dies nicht die richtige Antwort ist. Codepage-Inkompatibilitäten sind ein Schmerz, und Unicode ist die Heilung für Codepage Probleme. Mit günstiger Scheibe und heutzutage Speichern, gibt es wirklich keinen Grund, Zeit zu verschwenden herumschlagen mit Codepages mehr.

Alle modernen Betriebssysteme und Entwicklungsplattformen verwenden intern Unicode. Durch nvarchar Verwendung anstatt varchar, können Sie tun Kodierungskonvertierungen jedes Mal, wenn Sie aus lesen vermeiden oder in die Datenbank schreiben. Conversions einige Zeit dauern, und ist fehleranfällig. Und die Erholung von Konvertierungsfehler ist ein nicht-triviales Problem.

Wenn Sie mit einer Anwendung eine Schnittstelle, die nur ASCII verwendet, würde ich noch empfehlen die Verwendung von Unicode in der Datenbank. Die OS und Datenbankkollatierung Algorithmen arbeiten besser mit Unicode. Unicode vermeidet Probleme, Umwandlung, wenn sie mit andere Systeme Schnittstelle. Und Sie werden für die Zukunft vorbereiten. Und Sie können immer überprüfen, ob Ihre Daten auf 7-Bit-ASCII beschränkt ist für was auch immer Altsystem Sie zu halten haben sollten, auch wenn einige der Vorteile der vollen Unicode-Speicherung zu genießen.

Andere Tipps

varchar : mit variabler Länge , nicht-Unicode-Zeichendaten. Die Datenbankkollatierungs bestimmt, welche Codepage die Daten gespeichert werden.

nvarchar : mit variabler Länge Unicode-Zeichendaten. Abhängig von der Datenbanksortierung für Vergleiche.

Mit diesem Wissen, Einsatz je nachdem, welche Eingabedaten übereinstimmt (ASCII v. Unicode).

Ich benutze nvarchar immer, wie es alles, was erlaubt Ich baue alle Daten zu widerstehen, so ziemlich ich an ihn werfen. Mein CMS-System tut Chinesen durch Zufall, weil ich nvarchar verwendet. In diesen Tagen, werden alle neuen Anwendungen sollten wirklich nicht mit der Menge des betreffenden Raumes erforderlich.

Es hängt davon ab, wie Oracle installiert wurde. Während des Installationsvorgangs wird die NLS_CHARACTERSET Option. Sie können in der Lage sein, es mit der Abfrage SELECT value$ FROM sys.props$ WHERE name = 'NLS_CHARACTERSET' zu finden.

Wenn Ihr NLS_CHARACTERSET eine Unicode-Codierung wie UTF-8, ist groß. Mit VARCHAR und NVARCHAR sind ziemlich identisch. Stoppen Sie jetzt lesen, nur für ihn gehen. Andernfalls, oder wenn Sie keine Kontrolle über den Oracle-Zeichensatz haben, lesen Sie weiter.

VARCHAR - Daten werden in der NLS_CHARACTERSET Codierung gespeichert. Wenn es andere Datenbankinstanzen auf demselben Server sind, können Sie durch sie eingeschränkt werden; und umgekehrt, da Sie die Einstellung teilen. Ein solches Feld kann eine beliebige Daten speichern, die diesen Zeichensatz codiert werden kann, und nichts anderes . So zum Beispiel, wenn der Zeichensatz MS-1252, können Sie nur speichern Zeichen wie englische Buchstaben, eine Handvoll Umlaute und einige andere (wie € und -). Ihre Anwendung würde nur auf wenige Gegenden, nicht in der Lage zu arbeiten überall sonst auf der Welt nützlich sein. Aus diesem Grunde ist es eine schlechte Idee betrachtet.

NVARCHAR - Daten werden in einer Unicode-Codierung gespeichert. Jede Sprache wird unterstützt. Eine gute Idee.

Was Speicherplatz? VARCHAR ist in der Regel effizienter, da der Zeichensatz / Codierung für ein bestimmtes Gebietsschema individuell entworfen wurde. NVARCHAR Felder speichern, entweder in UTF-8 oder UTF-16-Codierung, Basis auf dem NLS ironischerweise Einstellung. UTF-8 ist sehr effizient für „westliche“ Sprachen, während sie noch asiatische Sprachen unterstützen. UTF-16 ist sehr effizient für asiatische Sprachen, während nach wie vor „westliche“ Sprachen unterstützt. Wenn über Speicherplatz betrifft, Pick Einstellung ein NLS Oracle verursachen UTF-8 zu verwenden oder UTF-16 entsprechend.

Was ist die Verarbeitungsgeschwindigkeit? Die meisten neue Codierung Plattformen verwenden Unicode nativ (Java, .NET, auch C ++ std :: von Jahren wstring vor!) Dann, wenn das Datenbankfeld ist VARCHAR es zwingt Oracle zwischen Zeichensätzen jeder auf Lesen oder Schreiben, nicht so gut zu konvertieren. Mit NVARCHAR vermeidet die Konvertierung.

Fazit: Verwenden Sie NVARCHAR! Es vermeidet Einschränkungen und Abhängigkeiten, ist für Speicherplatz in Ordnung, und in der Regel am besten für die Leistung zu.

nvarchar speichern Daten als Unicode, so, wenn Sie mehrsprachige Daten speichern gehen (mehr als eine Sprache) in einer Datenspalte müssen Sie die N-Variante.

Mein zwei Cent

  1. Indizes kann fehlschlagen, wenn nicht die richtigen Datentypen verwendet werden:
    In SQL Server: Wenn Sie einen Index über eine VARCHAR-Spalte haben und präsentieren sie einen Unicode-String, wird SQL Server nicht die Verwendung des Index machen. Das gleiche passiert, wenn Sie eine BigInt auf eine indizierte Spalte enthält SmallInt präsentieren. Auch wenn die BigInt klein genug sind, ein SmallInt zu sein, ist SQL Server nicht in der Lage, den Index zu verwenden. Der andere Weg, um Sie nicht über dieses Problem (wenn SmallInt oder Ansi-Code eine indizierten BigInt ot NVARCHAR Spalte bereitstellt).

  2. Datentypen zwischen verschiedenen DBMS (Data Base Management System) kann variieren:
    Wissen, dass jede Datenbank überall gleich leicht unterschiedliche Datentypen und VARCHAR nicht bedeutet hat. Während SQL Server VARCHAR und NVARCHAR haben, eine Apache / Derby-Datenbank nur VARCHAR hat, und es gibt VARCHAR in Unicode.

Vor allem nvarchar speichert Unicode-Zeichen und varchar speichert Nicht-Unicode-Zeichen.

„Unicodes“ bedeutet 16-Bit-Zeichencodierungsschema ermöglicht Zeichen aus vielen anderen Sprachen wie Arabisch, Hebräisch, Chinesisch, Japanisch, in einem einzigen Zeichensatz codiert werden.

Das bedeutet Unicodes wird mit 2 Byte pro Zeichen zu speichern und nonunicodes verwendet nur ein Byte pro Zeichen zu speichern. Was bedeutet, Unicodes doppelte Kapazität benötigen zu speichern im Vergleich zu nicht-Unicodes.

Sie haben Recht. nvarchar speichert Unicode-Daten während varchar speichert Single-Byte-Zeichendaten. Anders als Speicher Unterschiede (nvarchar erfordert den doppelten Speicherplatz als varchar), die Sie schon der Hauptgrund für die Bevorzugung nvarchar über varchar erwähnt, würde die Internationalisierung sein (das heißt Strings in anderen Sprachen zu speichern).

Ich würde sagen, es hängt davon ab.

Wenn Sie eine Desktop-Anwendung entwickeln, in denen das Betriebssystem in Unicode arbeitet (wie alle aktuellen Windows-Systeme) und Sprache nativ unterstützt Unicode (Standard Strings Unicode sind, wie in Java oder C #), dann nvarchar gehen.

Wenn Sie eine Web-Anwendung entwickeln, wo Strings kommen in UTF-8, und die Sprache ist PHP, die noch Unicode nicht unterstützt nativ (in den Versionen 5.x), dann wird varchar wahrscheinlich eine bessere Wahl sein.

NVarChar wird Ihnen helfen, Unicode-Zeichen zu speichern. Es ist der Weg zu gehen, wenn Sie lokalisierte Daten gespeichert werden sollen.

Wenn ein einzelnes Byte verwendet wird, um ein Zeichen zu speichern, gibt es 256 mögliche Kombinationen, und dadurch können Sie 256 verschiedene Zeichen speichern. Collation ist das Muster, das die Charaktere und die Regeln definiert, mit denen sie verglichen werden und sortiert werden.

1252, die die Latin1 (ANSI) ist, ist die häufigste. Single-Byte-Zeichensätze sind ebenfalls unzureichend alle Zeichen von vielen Sprachen verwendet zu speichern. Zum Beispiel haben einige asiatischen Sprachen Tausende von Zeichen, so müssen sie zwei Bytes pro Zeichen verwendet werden.

Unicode-Standard

Wenn Systeme mehr Codepages Verwendung in einem Netzwerk verwendet werden, wird es schwierig, die Kommunikation zu verwalten. Zur Standardisierung Dinge führte die ISO und Unicode-Konsortium der Unicode . Unicode verwendet zwei Bytes jedes Zeichen zu speichern. Das ist 65.536 verschiedene Zeichen definiert werden können, so dass fast alle Zeichen mit Unicode abgedeckt werden. Wenn zwei Computer Unicode verwenden, wird jedes Symbol in der gleichen Art und Weise dargestellt werden und keine Konvertierung erforderlich ist -. Das ist die Idee hinter Unicode

SQL Server verfügt über zwei Kategorien von Zeichendatentypen:

  • Nicht-Unicode (char, varchar und Text)
  • Unicode (nchar, nvarchar und ntext)

Wenn wir Zeichendaten aus mehreren Ländern speichern müssen, immer Unicode verwenden.

Obwohl NVARCHAR speichert Unicode, Sie mit Hilfe des Vergleichs in Betracht ziehen sollten auch Sie VARCHAR verwenden und Ihre Daten Ihrer lokalen Sprachen speichern.

Man stelle sich vor das folgende Szenario vor.

Die Sortierung Ihrer DB ist persische und Sie einen Wert wie speichern ‚علی‘ (persisch Schreiben von Ali) im VARCHAR(10) Datentyp. Es gibt kein Problem und das DBMS verwendet nur drei Bytes zu speichern.

Wenn Sie jedoch Ihre Daten in einer anderen Datenbank übertragen werden sollen und das korrekte Ergebnis Ihrer Zieldatenbank sehen muß die gleiche Sortierung wie das Ziel hat, die Perser in diesem Beispiel ist.

Wenn Sie Ihre Zielsortierungs unterschiedlich ist, sehen Sie einige Fragezeichen (?) In der Zieldatenbank.

Schließlich erinnern, wenn Sie eine riesige Datenbank verwenden, die für die Nutzung Ihrer Landessprache ist, würde ich empfehlen Lage zu verwenden, anstatt zu viele Räume zu verwenden.

Ich glaube, dass das Design unterschiedlich sein kann. Es hängt von der Umgebung, die Sie arbeiten.

Ich habe hier zu sagen (ich weiß, dass ich mich wahrscheinlich werde ein Verriss öffnen!), Aber sicher das einzige Mal, wenn NVARCHAR eigentlich ist nützlich (beachten Sie die mehr dort!) als VARCHAR ist, wenn alle der Sortierungen auf alle abhängigen Systeme und innerhalb der Datenbank selbst gleich sind ...? Wenn nicht, dann hat Sortierungs Umwandlung sowieso passieren und so macht VARCHAR ebenso rentabel wie NVARCHAR.

, um diese hinzuzufügen, einige Datenbanksysteme wie SQL Server (vor 2012) haben eine Seitengröße von ca. 8 TAUSEND. Also, wenn Sie schauen, um durchsuchbare Daten speichern nicht in so etwas wie eine TEXT oder NTEXT Feld gehalten dann stellt VARCHAR den Wert zum vollständigen 8k Platz während NVARCHAR nur bietet 4k (Doppel der Bytes, die doppelte Leerzeichen).

Ich nehme an, zusammenfassen, die Verwendung von entweder ist abhängig von:

  • Projekt oder Kontext
  • Infrastruktur
  • Datenbanksystem

Folgen Unterschied zwischen SQL Server VARCHAR und NVARCHAR-Datentyp . Hier können Sie in einem sehr anschaulich sehen können.

In generalnvarchar speichern Daten als Unicode, so, wenn Sie mehrsprachige Daten speichern gehen (mehr als eine Sprache) in einer Datenspalte müssen Sie die N-Variante.

hatte ich einen Blick auf die Antworten und viele scheinen zu empfehlen nvarchar über varchar zu verwenden, weil der Platz kein Problem mehr ist, so gibt es keinen Schaden in ermöglicht Unicode für wenig zusätzlichen Speicherplatz. Nun, das ist nicht immer der Fall, wenn Sie einen Index über Ihre Spalte anwenden möchten. SQL Server hat ein Limit von 900 Byte auf der Größe des Feldes Sie Index kann. Wenn Sie also eine varchar(900) haben, können Sie immer noch indizieren, aber nicht varchar(901). Mit nvarchar wird die Anzahl der Zeichen halbiert, so können Sie Index bis nvarchar(450). Also, wenn Sie sicher sind Sie nicht nvarchar brauchen, ich würde es nicht empfehlen verwenden.

In der Regel in Datenbanken, empfehle ich das Festhalten an der Größe, die Sie benötigen, weil Sie immer erweitern. Zum Beispiel dachte ein Kollege bei der Arbeit einmal, dass es kein Schaden nvarchar(max) für eine Spalte in Verwendung, da wir kein Problem mit der Lagerung bei allen. Später, als wir einen Index für diese Spalte, SQL Server lehnte dies anzuwenden versuchen. Wenn er jedoch mit noch varchar(5) begann, konnten wir es einfach erweitert haben später zu dem, was wir ohne ein solches Problem benötigen, die uns erfordern ein Feld Migrationsplan zu tun, um dieses Problem zu beheben.

Der Hauptunterschied zwischen Varchar(n) und nvarchar(n) ist: eingeben Bild Beschreibung hier

Varchar (mit variabler Länge, Nicht-Unicode-Zeichendaten) Größe ist bis zu 8000.  1.It ist ein Datentyp mit variabler Länge

  1. Gebrauchte Nicht-Unicode-Zeichen speichern

  2. Belegt 1 Byte Speicherplatz für jedes Zeichen

Nvarchar. Variabler Länge Unicode-Zeichendaten

1.It ist ein variabler Länge Datentyp

2.Used Unicode-Zeichen zu speichern.

  1. Die Daten werden in einer Unicode-Codierung gespeichert. Jeder Sprache wird unterstützt. (Zum Beispiel der Sprachen Arabisch, Deutsch, Hindi, usw. usw.)

Jeffrey L Whitledge mit einem Reputationswert von ~47.000 empfiehlt die Verwendung von nvarchar

Solomon Rutzky mit einem Reputationswert von ~33200 empfiehlt:Verwenden Sie NICHT immer NVARCHAR.Das ist eine sehr gefährliche und oft kostspielige Einstellung/Ansatz.

Was sind die wichtigsten Leistungsunterschiede zwischen den SQL Server-Datentypen varchar und nvarchar?

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

Was wählt ein lernender SQL-Server-Datenbankentwickler, beide Personen mit so hohem Ansehen?

In Antworten und Kommentaren gibt es viele Warnungen zu Leistungsproblemen, wenn Sie bei der Auswahl nicht konsistent sind.

Es gibt Kommentare pro/con nvarchar für die Leistung.

Es gibt Kommentare pro/contra varchar für die Leistung.

Ich habe eine besondere Anforderung an eine Tabelle mit vielen hundert Spalten, was an sich wahrscheinlich ungewöhnlich ist?

Ich wähle Varchar, um zu vermeiden, dass ich mich der Tabellendatensatzgrößenbeschränkung von SQL*Server 2012 von 8060 Byte annähere.

Die Verwendung von nvarchar überschreitet für mich diese 8060-Byte-Grenze.

Ich denke auch, dass ich die Datentypen der zugehörigen Codetabellen an die Datentypen der primären zentralen Tabelle anpassen sollte.

Ich habe die Verwendung von Varchar-Spalten an diesem Arbeitsplatz, der südaustralischen Regierung, durch frühere erfahrene Datenbankentwickler gesehen, wo die Anzahl der Tabellenzeilen mehrere Millionen oder mehr betragen wird (und wenn überhaupt, nur sehr wenige Nvarchar-Spalten in diesen sehr großen Spalten). Tabellen), sodass möglicherweise die erwarteten Datenzeilenvolumina Teil dieser Entscheidung sind.

nvarchar ist sicher im Vergleich zu varchar nutzen, um unseren Code fehlerfrei (Typ unpassenden) zu machen, weil nvarchar auch Unicode-Zeichen erlaubt. Wenn wir verwenden where Zustand in Abfrage SQL Server und wenn wir = Operator verwenden, wird es werfen einige mal Fehler. Wahrscheinliche Ursache hierfür ist unsere Mapping Spalte in varchar werden difined wird. Wenn wir es in nvarchar dieses Problem definierten meine nicht passieren. Dennoch halten wir dieses Problem varchar und vermeiden wir besser LIKE Schlüsselwort statt = verwenden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top