Ist es nur, dass nvarchar
unterstützt Multibyte-Zeichen? Wenn das der Fall ist, gibt es dann wirklich einen Grund, abgesehen von Speicherproblemen, für die Verwendung von varchars
?
Antworten
Zu viele Anzeigen?Eine nvarchar
Spalte kann beliebige Unicode-Daten speichern. A varchar
Spalte ist auf eine 8-Bit-Codepage beschränkt. Einige Leute denken, dass varchar
verwendet werden, da sie weniger Platz beansprucht. Ich glaube, dass dies nicht die richtige Antwort ist. Codepage-Inkompatibilitäten sind ein Problem, und Unicode ist das Heilmittel für Codepage-Probleme. Da heutzutage Festplatten und Speicherplatz billig sind, gibt es wirklich keinen Grund mehr, Zeit mit Codepages zu verschwenden.
Alle modernen Betriebssysteme und Entwicklungsplattformen verwenden intern Unicode. Durch die Verwendung nvarchar
statt varchar
können Sie vermeiden, bei jedem Lesen oder Schreiben in die Datenbank eine Kodierungsumwandlung vorzunehmen. Konvertierungen brauchen Zeit und sind fehleranfällig. Und die Wiederherstellung nach Konvertierungsfehlern ist ein nicht triviales Problem.
Wenn Sie eine Schnittstelle zu einer Anwendung haben, die nur ASCII verwendet, würde ich trotzdem empfehlen, Unicode in der Datenbank zu verwenden. Die Kollationierungsalgorithmen des Betriebssystems und der Datenbank funktionieren besser mit Unicode. Unicode vermeidet Konvertierungsprobleme beim Zusammenspiel mit andere Systeme. Und Sie werden sich auf die Zukunft vorbereiten. Und Sie können immer bestätigen, dass Ihre Daten auf 7-Bit-ASCII beschränkt sind, egal welches Altsystem Sie pflegen müssen, während Sie gleichzeitig einige der Vorteile der vollständigen Unicode-Speicherung genießen.
varchar : Daten mit variabler Länge, die keine Unicode-Zeichen sind. Die Kollation der Datenbank bestimmt, in welcher Codepage die Daten gespeichert werden.
nvarchar : Unicode-Zeichendaten mit variabler Länge. Abhängig von der Kollation der Datenbank für Vergleiche.
Mit diesem Wissen verwenden Sie die für Ihre Eingabedaten passende Variante (ASCII vs. Unicode).
Ich verwende immer nvarchar, denn damit kann ich so ziemlich alle Daten verarbeiten, die ich in die Datenbank einfüge. Mein CMS-System funktioniert zufällig mit Chinesisch, weil ich nvarchar verwendet habe. Heutzutage sollte man sich bei neuen Anwendungen keine Gedanken mehr über den benötigten Speicherplatz machen.
Das hängt davon ab, wie Oracle installiert wurde. Während des Installationsprozesses wird die Option NLS_CHARACTERSET gesetzt. Möglicherweise können Sie sie mit der Abfrage SELECT value$ FROM sys.props$ WHERE name = 'NLS_CHARACTERSET'
.
Wenn Ihr NLS_CHARACTERSET eine Unicode-Kodierung wie UTF8 ist, ist das großartig. Die Verwendung von VARCHAR und NVARCHAR ist ziemlich identisch. Hören Sie jetzt auf zu lesen und machen Sie es einfach. Andernfalls, oder wenn Sie keine Kontrolle über den Oracle-Zeichensatz haben, lesen Sie weiter.
VARCHAR - Die Daten werden in der Kodierung NLS_CHARACTERSET gespeichert. Wenn es andere Datenbankinstanzen auf demselben Server gibt, können Sie durch diese eingeschränkt werden; und umgekehrt, da Sie die Einstellung gemeinsam nutzen müssen. Ein solches Feld kann alle Daten speichern, die mit diesem Zeichensatz kodiert werden können, und nichts anderes. . Wenn der Zeichensatz z. B. MS-1252 ist, können Sie nur Zeichen wie englische Buchstaben, eine Handvoll Akzentbuchstaben und ein paar andere (wie € und -) speichern. Ihre Anwendung wäre nur für einige wenige Länder geeignet und könnte nirgendwo anders auf der Welt eingesetzt werden. Aus diesem Grund ist es eine schlechte Idee.
NVARCHAR - Die Daten werden in einer Unicode-Kodierung gespeichert. Jede Sprache wird unterstützt. Eine gute Idee.
Wie sieht es mit dem Speicherplatz aus? VARCHAR ist im Allgemeinen effizient, da der Zeichensatz/die Kodierung für ein bestimmtes Gebietsschema entwickelt wurde. NVARCHAR-Felder werden entweder in UTF-8- oder UTF-16-Kodierung gespeichert, was ironischerweise von der NLS-Einstellung abhängt. UTF-8 ist sehr effizient für "westliche" Sprachen, unterstützt aber auch asiatische Sprachen. UTF-16 ist sehr effizient für asiatische Sprachen, unterstützt aber auch "westliche" Sprachen. Wenn Sie sich Sorgen um den Speicherplatz machen, wählen Sie eine NLS-Einstellung, die Oracle veranlasst, je nach Bedarf UTF-8 oder UTF-16 zu verwenden.
Wie sieht es mit der Verarbeitungsgeschwindigkeit aus? Die meisten neuen Codierungsplattformen verwenden Unicode von Haus aus (Java, .NET, sogar C++ std::wstring von vor Jahren!). Wenn also das Datenbankfeld VARCHAR ist, ist Oracle gezwungen, bei jedem Lesen oder Schreiben zwischen den Zeichensätzen zu konvertieren, was nicht so gut ist. Die Verwendung von NVARCHAR vermeidet diese Konvertierung.
Unterm Strich: Verwenden Sie NVARCHAR! Es vermeidet Einschränkungen und Abhängigkeiten, ist gut für den Speicherplatz und in der Regel auch am besten für die Leistung.
- See previous answers
- Weitere Antworten anzeigen