Rozważ następujące dwa stwierdzenia:
PRINT CONVERT(NUMERIC(38, 0), 0x0100000001, 0);
PRINT CONVERT(NUMERIC(38, 0), 0x0100010001, 0);
Oba wyrażenia powracają -1
; czy to nie jest niepoprawne, ponieważ druga wartość binarna jest o 65.536 dziesiętna wyższa od pierwszej wartości, prawda?
Z pewnością nie może to wynikać z cichego obcinania?
Jeśli uruchomię następujące instrukcje:
PRINT CONVERT(NUMERIC(38, 0), 0x00000001, 0);
PRINT CONVERT(NUMERIC(38, 0), 0x00010001, 0);
Pojawia się następujący błąd:
Msg 8114, Level 16, State 5, Line 1
Error converting data type varbinary to numeric.
Jak zdiagnozować, co się tutaj dzieje?
Używam tego na SQL Server 2012, wersja 11.0.5058. Wyniki są takie same dla SQL Server 2008 R2 SP2, SQL Server 2005 i SQL Server 2000.
sql-server
sql-server-2008
sql-server-2012
Max Vernon
źródło
źródło
SELECT CONVERT(VARBINARY(32), 1), CONVERT(VARBINARY(32), 1.0);
PRINT CONVERT(NUMERIC(38, 0), convert(int, 0x00000001), 0); PRINT CONVERT(NUMERIC(38, 0), convert(int, 0x00010001), 0);
.Odpowiedzi:
Liczby dziesiętne i liczby całkowite są kodowane w różny sposób w języku varbinary. Miejsca dziesiętne wymagają więcej miejsca. Próbować:
Jeśli chodzi o twój ostateczny cel, jakim jest przechowywanie liczb całkowitych w postaci liczbowej, aby zaoszczędzić miejsce, myślę, że sam odpowiedziałeś na to pytanie - nie warto.
źródło