Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

LEN() vs. DATALENGTH() in SQL Server

Bei Verwendung von T-SQL in SQL Server (oder Azure) wird LEN() und DATALENGTH() Funktionen geben oft das gleiche Ergebnis zurück, aber nicht immer. Es gibt einige Fälle, in denen diese Funktionen völlig unterschiedliche Ergebnisse für anscheinend dieselben Daten zurückgeben. Dies liegt daran, dass es einen wichtigen Unterschied gibt, wie LEN() und DATALENGTH() Funktionen funktionieren, wie wir hier sehen werden.

Hier ist zunächst eine kurze Definition von jedem:

LEN()
Gibt die Anzahl der Zeichen des angegebenen Zeichenfolgenausdrucks zurück, ausschließlich nachgestellte Leerzeichen.
DATALENGTH()
Gibt die Anzahl der Bytes zurück, die zur Darstellung eines beliebigen Ausdrucks verwendet werden.

Beachten Sie „Zeichen“ vs. „Bytes“. Beachten Sie auch, dass „nachgestellte Leerzeichen ausschließen“ nur für einen gilt.

Hier sind einige Beispiele, um die Unterschiede zwischen LEN() zu demonstrieren und DATALENGTH() .

Nachgestellte Leerzeichen

Ein Unterschied zwischen LEN() und DATALENGTH() Funktionen ist, dass LEN() Funktion schließt aus nachgestellte Leerzeichen (nachgestellte Leerzeichen, Tabulatoren usw.), während DATALENGTH() enthält nachgestellte Leerzeichen. Beachten Sie, dass wir nur über Leerzeichen sprechen, die am Ende stehen der Saite – nicht am Anfang oder in der Mitte.

Hier ist ein Beispiel ohne nachgestellte Leerzeichen:

SELECT 
    LEN('Lit') AS Len,
    DATALENGTH('Lit') AS DataLength;

Ergebnis:

Len  DataLength
---  ----------
3    3   

Und hier ist ein Beispiel mit nachgestellte Leerzeichen:

SELECT 
    LEN('Lit ') AS Len,
    DATALENGTH('Lit ') AS DataLength;

Ergebnis:

Len  DataLength
---  ----------
3    4  

Führende Leerzeichen werden jedoch von beiden Funktionen gezählt:

SELECT 
    LEN(' Lit') AS Len,
    DATALENGTH(' Lit') AS DataLength;

Ergebnis:

Len  DataLength
---  ----------
4    4         

Bytes vs. Zeichen

Ein weiterer wichtiger Unterschied zwischen LEN() und DATALENGTH() ist das LEN() Funktion gibt die Anzahl der Zeichen zurück in einer Schnur. Andererseits DATALENGTH() gibt die Anzahl von Bytes zurück in einem Ausdruck.

Dies ist ein wichtiger Unterschied, da die Anzahl der Bytes in einem Ausdruck nicht unbedingt mit der Anzahl der Zeichen in der Zeichenfolge übereinstimmt. Beim Verarbeiten einer Unicode-Zeichenfolge DATALENGTH() gibt die doppelte Anzahl von Zeichen zurück. Dies liegt daran, dass ein Unicode-String 2 Bytes pro Zeichen speichert.

Im obigen Beispiel haben wir gesehen, dass sowohl LEN() und DATALENGTH() lieferte das gleiche Ergebnis für das Wort Lit ( 3 ). Sobald wir jedoch mit der Abfrage einer Datenbank beginnen, hängt das Ergebnis davon ab, wie die Daten gespeichert werden. Zum Beispiel, wenn es als varchar gespeichert ist , die Ergebnisse sind die gleichen. Wenn es als nvarchar gespeichert ist die DATALENGTH() Die Funktion gibt die doppelte Anzahl von Zeichen zurück. Und wenn es beispielsweise so gespeichert ist, char(25)DATALENGTH() gibt genau 25 Zeichen zurück.

Beispiele

Lassen Sie uns die folgende Abfrage ausführen:

SELECT 
    ArtistName, 
    LEN(ArtistName) AS Len,
    DATALENGTH(ArtistName) AS DataLength
FROM Artists 
WHERE ArtistName = 'Lit';

Die Ergebnisse dieser Abfrage hängen davon ab, wie die Daten gespeichert werden.

nvarchar(255)

Wenn der ArtistName Spalte speichert Daten als nvarchar(255) :

ArtistName  Len  DataLength
----------  ---  ----------
Lit         3    6         

varchar(255)

Wenn wir diese Spalte in varchar(255) ändern , erhalten wir folgendes Ergebnis:

ArtistName  Len  DataLength
----------  ---  ----------
Lit         3    3         

char(25)

Wenn wir diese Spalte in char(25) ändern , erhalten wir folgendes Ergebnis:

ArtistName                 Len  DataLength
-------------------------  ---  ----------
Lit                        3    25        

Vielleicht ist eine Moral von all dem, wenn Sie feststellen, dass Sie seltsame Ergebnisse erhalten, wenn Sie versuchen, Zeichenfolgenlängen usw. abzurufen, überprüfen Sie, ob Sie die richtige Funktion verwenden.