Laut BOL für SQL Server 2008 R2 erfordert der Datentyp Dezimal die folgenden Speicherbytes:
Precision Storage bytes
1 - 9 => 5
10-19 => 9
20-28 => 13
29-38 => 17
Wenn ich jedoch eine Datenlänge () für eine Spalte mache, die dezimal (19,5) formatiert ist und den Wert 10999.99999 hat, erhalte ich 5 Bytes zurück? Das ist nach meinem Verständnis eine Genauigkeit von 10 und nicht von 9 und sollte zu 9 Bytes führen.
Dies führt zu zwei Fragen:
Hängt die Größe der Tabelle mit dieser Spalte nicht von der Spaltendefinition ab, sondern definieren die wahren Werte innerhalb der Spalte die Tabellengröße?
Warum stimmen die Informationen in BOL nicht mit den Daten überein, die () zurückgibt?
sql-server
sql-server-2008
datatypes
nojetlag
quelle
quelle
DATALENGTH
Meldung von 5 oder 9 Bytes in diesem Fall scheint42949.67295
(gespeichert als01 FF FF FF FF 00 00 00 00
) und42949.67296
(gespeichert als01 00 00 00 00 01 00 00 00
) zu sein. Ich bin mir nicht sicher, wie nützlich dieses Verhalten genau ist!CREATE TABLE [Test195]( [Date] [date] NULL, [Time] [time](3) NULL, [CCYPairID] [tinyint] NULL, [Price] [decimal](19, 5) NULL, [Amount] [bigint] NULL, )
SELECT [Date] ,[Time] ,[CCYPairID] ,DATALENGTH([CCYPairID]) as CByte ,[Price] ,DATALENGTH([Price]) as PByte ,[Amount] ,DATALENGTH([Amount]) as AByte FROM [Test195]
Antworten:
Mischen Sie nicht Speicher (5 oder 9 Bytes) und was Sie zurückbekommen
In einer Dezimalspalte (19,5) sind es immer 9 Bytes auf der Festplatte. Null benötigt also neun Bytes.
Sie
10999.99999
sind lediglich eine Darstellung dieser gespeicherten Nummer, die dann von DATALENGTH als 10999.99999 analysiert wirdBearbeiten:
DATALENGTH gibt die Anzahl der Bytes zurück, die zum Speichern des angegebenen Ausdrucks erforderlich sind. Der Datentyp wird meistens ignoriert . Wird
10999.99999
also als Dezimalzahl (10,5) behandelt , die in 5 Bytes und nicht in 9 Bytes gespeichert werden kann , wie Martin in einem Kommentar hervorhob.Eine Dezimalspalte (19,5) besteht also immer aus 9 Bytes. DATALENGTH ist das egal. Es betrachtet den Ausdruck
10999.99999
und entscheidet, dass er in 5 Bytes gespeichert werden kann. Aber natürlich kann es nichtPersönlich habe ich DATALENGTH nie verwendet, außer um Leerzeichen oder ähnliches zu finden.
Verwenden Sie DATALENGTH grundsätzlich nicht für Datentypen ohne Zeichenfolge.
Hinweis: LEN gibt an, wie lang die Zeichenfolgendarstellung ist
quelle