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?Sie haben Recht. nvarchar
speichert Unicode-Daten, während varchar
speichert Einzelbyte-Zeichendaten. Abgesehen von den Unterschieden bei der Speicherung ( nvarchar
benötigt doppelt so viel Speicherplatz wie varchar
), die Sie bereits erwähnt haben, der Hauptgrund für die Bevorzugung von nvarchar
en varchar
wäre die Internationalisierung (d. h. die Speicherung von Zeichenketten in anderen Sprachen).
Ich würde sagen, es kommt darauf an.
Wenn Sie eine Desktop-Anwendung entwickeln, bei der das Betriebssystem in Unicode arbeitet (wie alle aktuellen Windows-Systeme) und die Sprache nativ Unicode unterstützt (Standard-Strings sind Unicode, wie in Java oder C#), dann verwenden Sie nvarchar.
Wenn Sie eine Webanwendung entwickeln, bei der Strings im Format UTF-8 eingehen, und die Sprache PHP ist, die Unicode immer noch nicht nativ unterstützt (in Version 5.x), dann ist varchar wahrscheinlich die bessere Wahl.
Wenn ein einzelnes Byte zum Speichern eines Zeichens verwendet wird, gibt es 256 mögliche Kombinationen, so dass Sie 256 verschiedene Zeichen speichern können. Kollation ist das Muster, das die Zeichen und die Regeln, nach denen sie verglichen und sortiert werden, definiert.
1252, die Latin1 (ANSI), ist die am weitesten verbreitete. Ein-Byte-Zeichensätze reichen auch nicht aus, um alle Zeichen zu speichern, die in vielen Sprachen verwendet werden. Einige asiatische Sprachen haben zum Beispiel Tausende von Zeichen, so dass sie zwei Bytes pro Zeichen verwenden müssen.
Unicode-Norm
Wenn Systeme mit mehreren Codepages in einem Netz verwendet werden, wird es schwierig, die Kommunikation zu verwalten. Um die Dinge zu standardisieren, haben die ISO und das Unicode-Konsortium die Unicode . Unicode verwendet zwei Bytes zur Speicherung jedes Zeichens. Das heißt, es können 65.536 verschiedene Zeichen definiert werden, so dass fast alle Zeichen mit Unicode abgedeckt werden können. Wenn zwei Computer Unicode verwenden, wird jedes Symbol auf die gleiche Weise dargestellt und es ist keine Umwandlung erforderlich - 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, verwenden wir immer Unicode.
Obwohl NVARCHAR
Unicode speichert, sollten Sie mit Hilfe der Kollationierung auch berücksichtigen, dass Sie VARCHAR
und speichern Sie Ihre Daten in Ihrer Landessprache.
Stellen Sie sich das folgende Szenario vor.
Die Sortierung Ihrer DB ist persisch und Sie speichern einen Wert wie '' (persische Schreibweise von Ali) in der VARCHAR(10)
Datentyp. Es gibt kein Problem und das DBMS verwendet nur drei Bytes, um ihn zu speichern.
Wenn Sie jedoch Ihre Daten in eine andere Datenbank übertragen und das korrekte Ergebnis sehen wollen, muss Ihre Zieldatenbank die gleiche Sortierung wie die Zieldatenbank haben, was in diesem Beispiel Persisch ist.
Wenn Ihre Zielsortierung anders ist, sehen Sie in der Zieldatenbank einige Fragezeichen(?).
Denken Sie schließlich daran, dass Sie bei einer großen Datenbank, die für die Verwendung in Ihrer Landessprache bestimmt ist, die Ortsangabe verwenden sollten, anstatt zu viele Leerzeichen zu verwenden.
Ich glaube, dass das Design anders sein kann. Es hängt von der Umgebung ab, in der Sie arbeiten.