Frage Was ist der Unterschied zwischen varchar und nvarchar?


Ist es nur das? nvarchar unterstützt Multibyte-Zeichen? Wenn das der Fall ist, gibt es wirklich, abgesehen von Speicherproblemen, irgendeinen Zweck zu verwenden varchars?


1167
2017-09-27 19:34


Ursprung


Antworten:


Ein nvarchar Spalte kann alle Unicode-Daten speichern. EIN varchar Die Spalte ist auf eine 8-Bit-Codepage beschränkt. Einige denken, dass varchar sollte verwendet werden, weil es weniger Platz benötigt. Ich glaube, das ist nicht die richtige Antwort. Codepage-Inkompatibilitäten sind ein Problem und Unicode ist die Lösung für Codepage-Probleme. Mit billigen Platten und Speicher heutzutage gibt es wirklich keinen Grund mehr, Zeit damit zu verschwenden, mit Codepages herumzuspielen.

Alle modernen Betriebssysteme und Entwicklungsplattformen verwenden Unicode intern. Durch die Nutzung nvarchar eher, als varchar, können Sie vermeiden, Codierungskonvertierungen jedes Mal durchzuführen, wenn Sie von der Datenbank lesen oder in die Datenbank schreiben. Conversions benötigen Zeit und sind anfällig für Fehler. Und die Wiederherstellung von Konvertierungsfehlern ist ein nicht-triviales Problem.

Wenn Sie eine Schnittstelle zu einer Anwendung verwenden, die nur ASCII verwendet, würde ich dennoch empfehlen, Unicode in der Datenbank zu verwenden. Die Sortieralgorithmen für Betriebssysteme und Datenbanken funktionieren besser mit Unicode. Unicode vermeidet Konvertierungsprobleme beim Herstellen einer Verbindung andere Systeme. Und du wirst dich auf die Zukunft vorbereiten. Und Sie können immer sicherstellen, dass Ihre Daten für jedes Legacy-System, das Sie pflegen müssen, auf 7-Bit-ASCII beschränkt sind, selbst wenn Sie einige der Vorteile des vollständigen Unicode-Speichers genießen.


1435
2017-09-29 02:16



varchar: Nicht-Unicode-Zeichendaten mit variabler Länge. Die Datenbanksortierung bestimmt, mit welcher Codepage die Daten gespeichert werden.

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

Mit diesem Wissen können Sie die Eingabedaten verwenden (ASCII v. Unicode).


224
2017-09-27 19:37



Ich benutze immer nvarchar, da es allem, was ich baue, erlaubt, so ziemlich allen Daten zu widerstehen, die ich darauf werfe. Mein CMS-System tut Chinesisch zufällig, weil ich Nvarchar verwendet habe. Heutzutage sollten sich neue Anwendungen nicht wirklich mit dem Platzbedarf befassen.


61
2017-09-27 19:37



Hier sehen Sie die Unterschiede zwischen varchar und nvarchar.

Enter image description here

Enter image description here

Enter image description here

Enter image description here

Referenz: SqlHints.com

Weitere Informationen zu Nvarchar und varchar finden Sie unter dieser Blogbeitrag.


42
2017-11-24 08:45



Es hängt davon ab, wie Oracle installiert wurde. Während des Installationsprozesses wird die NLS_CHARACTERSET-Option festgelegt. Möglicherweise können Sie es mit der Abfrage finden SELECT value$ FROM sys.props$ WHERE name = 'NLS_CHARACTERSET'.

Wenn Ihr NLS_CHARACTERSET eine Unicode-Codierung wie UTF8 ist, großartig. Die Verwendung von VARCHAR und NVARCHAR ist ziemlich identisch. Hör auf zu lesen, geh einfach los. Andernfalls oder wenn Sie keine Kontrolle über den Oracle-Zeichensatz haben, lesen Sie weiter.

VARCHAR - Daten werden in der NLS_CHARACTERSET-Codierung gespeichert. Wenn sich andere Datenbankinstanzen auf demselben Server befinden, sind Sie möglicherweise eingeschränkt. und umgekehrt, da Sie die Einstellung teilen müssen. Ein solches Feld kann alle Daten speichern, die mit diesem Zeichensatz codiert werden können, und sonst nichts. Wenn beispielsweise der Zeichensatz MS-1252 ist, können Sie nur Zeichen wie englische Buchstaben, eine Handvoll akzentuierter Buchstaben und einige andere (wie € und -) speichern. Ihre Anwendung wäre nur für einige Länder nützlich und könnte nirgendwo anders auf der Welt eingesetzt werden. Aus diesem Grund wird es als eine schlechte Idee betrachtet.

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

Was ist mit Speicherplatz? VARCHAR ist im Allgemeinen effizient, da der Zeichensatz / die Codierung für ein bestimmtes Gebietsschema angepasst wurde. NVARCHAR Felder speichern entweder in UTF-8 oder UTF-16 Codierung, basierend auf der NLS Einstellung ironisch genug. UTF-8 ist sehr effizient für "westliche" Sprachen, unterstützt aber weiterhin asiatische Sprachen. UTF-16 ist sehr effizient für asiatische Sprachen und unterstützt dennoch "westliche" Sprachen. Wenn Sie Bedenken hinsichtlich des Speicherplatzes haben, wählen Sie eine NLS-Einstellung, damit Oracle UTF-8 oder UTF-16 entsprechend verwendet.

Was ist mit der Verarbeitungsgeschwindigkeit? Die meisten neuen Kodierungsplattformen verwenden Unicode nativ (Java, .NET, sogar C ++ std :: wstring von vor Jahren!), Wenn das Datenbankfeld VARCHAR ist, zwingt es Oracle, zwischen Zeichensätzen bei jedem Lesen oder Schreiben zu konvertieren, nicht so gut. Die Verwendung von NVARCHAR vermeidet die Konvertierung.

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


29
2017-10-07 18:08



nvarchar speichert Daten als Unicode. Wenn Sie mehrsprachige Daten (mehr als eine Sprache) in einer Datenspalte speichern möchten, benötigen Sie die N-Variante.


15
2017-09-27 19:36



Meine zwei Cent

  1. Indizes können fehlschlagen, wenn nicht die richtigen Datentypen verwendet werden:
    In SQL Server: Wenn Sie einen Index über eine VARCHAR-Spalte haben und eine Unicode-Zeichenfolge angeben, verwendet SQL Server den Index nicht. Das Gleiche passiert, wenn Sie BigInt einer indizierten Spalte mit SmallInt präsentieren. Auch wenn das BigInt klein genug ist, um ein SmallInt zu sein, kann SQL Server den Index nicht verwenden. Andersherum haben Sie dieses Problem nicht (wenn Sie SmallInt oder Ansi-Code für eine indizierte Spalte BigInt oder NVARCHAR bereitstellen).

  2. Datentypen können zwischen verschiedenen DBMS (DataBase Management System) variieren:
    Wissen Sie, dass jede Datenbank leicht unterschiedliche Datentypen hat und VARCHAR nicht überall gleich ist. Während SQL Server über VARCHAR und NVARCHAR verfügt, hat eine Apache / Derby-Datenbank nur VARCHAR und dort VARCHAR in Unicode.


13
2018-04-19 09:53



Hauptsächlich nvarchar speichert Unicode-Zeichen und varchar speichert Nicht-Unicode-Zeichen.

"Unicodes" bedeutet ein 16-Bit-Zeichencodierungsschema, mit dem Zeichen aus vielen anderen Sprachen wie Arabisch, Hebräisch, Chinesisch und Japanisch in einem einzigen Zeichensatz codiert werden können.

Das bedeutet, dass Unicodes 2 Bytes pro Zeichen zum Speichern verwendet und Nonunicodes nur ein Byte pro Zeichen zum Speichern verwendet. Das bedeutet, dass Unicodes doppelte Speicherkapazität benötigen, verglichen mit Nicht-Unicodes.


11
2017-12-14 12:09



Du hast recht. nvarchar speichert Unicode-Daten während varchar speichert Einzelbyte-Zeichendaten. Andere als Speicher Unterschiede (nvarcharbenötigt den doppelten Speicherplatz wie varchar), die Sie bereits erwähnt haben, der Hauptgrund für die Bevorzugung nvarchar Über varchar wäre Internationalisierung (d. h. Speicherung von Strings in anderen Sprachen).


9
2017-09-27 19:42



Ich würde sagen, es kommt darauf an.

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

Wenn Sie eine Webanwendung entwickeln, in der Zeichenfolgen als UTF-8 und Sprache als PHP verwendet werden, die nativ Unicode noch nicht unterstützen (in Version 5.x), ist varchar wahrscheinlich die bessere Wahl.


8
2018-01-25 10:19