Wird in einem nvarchar jedes Zeichen immer in zwei Bytes gespeichert?

7

Ich hatte (vielleicht naiv) angenommen, dass in SQL Server ein nvarchar jedes Zeichen in zwei Bytes speichert. Aber das scheint nicht immer der Fall zu sein. Die Dokumentation gibt an, dass einige Zeichen mehr Bytes benötigen. Hat jemand eine definitive Antwort?

    
Rich 17.01.2011, 13:22
quelle

3 Antworten

13

Ja, es verwendet 2 Bytes, benutzt die Datalänge, um die Speichergröße zu erhalten, du kannst nicht LEN verwenden, weil LEN nur die Zeichen zählt, siehe hier: Die Unterschiede zwischen LEN und DATALENGTH in SQL Server

%Vor%

Hier ist, was Books On Line hat: Ссылка

  

Zeichendatentypen, die entweder   feste Länge, nchar, oder   variable Länge, nvarchar, Unicode   Daten und verwenden Sie den UNICODE UCS-2   Zeichensatz.

     

nchar [(n)]

     

Unicode fester Länge   Zeichendaten von n Zeichen. n muss   sei ein Wert von 1 bis 4.000. Das   Speichergröße ist zweimal n Bytes. Das   ISO-Synonyme für nchar sind national   Saibling und nationaler Charakter.

     

nvarchar [(n | max)]

     

Unicode-Zeichen mit variabler Länge   Daten. n kann ein Wert von 1 bis sein   4.000. max gibt das Maximum an   Speichergröße ist 2 ^ 31-1 Bytes. Das   Speichergröße, in Bytes, ist zweimal   die Anzahl der eingegebenen Zeichen + 2   Bytes. Die eingegebenen Daten können 0 sein   Zeichen in der Länge. Die ISO-Synonyme   für nvarchar sind nationale char variant   und nationaler Charakter variiert.

Diese Unicode-Komprimierung wurde in SQL Server 2008 R2 eingeführt, sodass Ascii als 1 Byte gespeichert werden kann. Sie können hier über die Unicode-Komprimierung nachlesen Ссылка

    
SQLMenace 17.01.2011, 13:23
quelle
4

Da es mehr als 65536 Zeichen gibt, sollte es offensichtlich sein, dass ein Zeichen unmöglich in nur zwei Oktetts (d. h. 16 Bits) passen kann.

SQL Server verwendet wie die meisten Microsoft-Produkte (Windows, .NET, NTFS, ...) UTF-16 zum Speichern von Text, wobei ein Zeichen entweder zwei oder vier Oktette belegt, obwohl @SQLMenace darauf hinweist, aktuelle Versionen von SQL Server verwenden Komprimierung, um das zu reduzieren.

    
Jörg W Mittag 17.01.2011 13:29
quelle
4

Mein Verständnis dieses Problems ist, dass SQL Server intern UCS-2 verwendet, aber dass seine UCS-2-Implementierung gehackt wurde, um eine Teilmenge von Zeichen mit bis zu 4 Byte im GB18030-Zeichensatz , die als UCS-2 gespeichert sind, aber bei der Abfrage transparent von der Datenbank-Engine wieder in Multibyte-Zeichen konvertiert werden.

>

Ersatzzeichen / Zusatzzeichen werden nicht vollständig unterstützt - die Implementierung einiger SQL Server-Zeichenfolgenfunktionen unterstützt keine Ersatzpaare, wie detailliert hier .

    
Ed Harper 17.01.2011 14:11
quelle

Tags und Links