Considérez les deux déclarations suivantes:
PRINT CONVERT(NUMERIC(38, 0), 0x0100000001, 0);
PRINT CONVERT(NUMERIC(38, 0), 0x0100010001, 0);
Les deux déclarations reviennent -1
; n'est-ce pas incorrect puisque la deuxième valeur binaire est supérieure de 65 536 décimales à la première valeur, n'est-ce pas?
Cela ne peut certainement pas être dû à une troncature silencieuse?
Si je lance les instructions suivantes:
PRINT CONVERT(NUMERIC(38, 0), 0x00000001, 0);
PRINT CONVERT(NUMERIC(38, 0), 0x00010001, 0);
On me présente l'erreur suivante:
Msg 8114, Level 16, State 5, Line 1
Error converting data type varbinary to numeric.
Comment puis-je diagnostiquer ce qui se passe ici?
J'exécute cela sur SQL Server 2012, v11.0.5058. Les résultats sont les mêmes sur SQL Server 2008 R2 SP2, SQL Server 2005 et SQL Server 2000.
sql-server
sql-server-2008
sql-server-2012
Max Vernon
la source
la source
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);
.Réponses:
Les nombres décimaux et entiers sont codés très différemment en varbinary. Les décimales ont besoin de plus d'espace. Essayer:
Quant à votre objectif ultime, stocker des nombres entiers sous forme de fichiers varbinary pour économiser de l'espace, je pense que vous avez répondu vous-même à cette question - cela n'en vaut pas la peine.
la source