Dans SQL Server, vous pouvez utiliser FLOAT
ou REAL
pour stocker des valeurs à virgule flottante dont le format de stockage est défini par la norme IEEE 754. Pour les valeurs à virgule fixe, nous pouvons utiliser le type DECIMAL
(qui a un synonyme NUMERIC
). Cependant, je ne suis pas sûr de savoir comment SQL Server stocker DECIMAL
valeurs en interne. Par exemple, si je définis une table et insérer une ligne comme celle-ci:Comment SQL Server stocke-t-il les valeurs de type décimal en interne?
IF OBJECT_ID('dbo.test_number_types') IS NOT NULL DROP TABLE dbo.test_number_types;
CREATE TABLE dbo.test_number_types
(
id INT IDENTITY(1, 1),
c1 NUMERIC(5, 4)
)
GO
INSERT INTO dbo.test_number_types(c1)VALUES(5.7456);
Lorsque j'utilise la commande DBCC PAGE
pour vérifier comment SQL Server stocke le numéro 5,7456, je suis arrivé ceci:
01 70 E0 00 00
Cet hex chaîne devrait utiliser peu endian. Je ne peux pas comprendre comment SQL Server tourne 5.7456 en 01 70 E0 00 00
et comment il décide combien d'octets sont pour la partie intégrale et combien d'octets sont pour les parties décimales. Quelqu'un peut-il aider?
BTW, j'ai vérifié le livre "SQL Server 2012 Internals". Il y a un chapitre dédié au stockage de type de données. Mais il semble DECIMAL
le stockage de type n'est pas mentionné dans le livre.
Astuce: BCD, décimal codé en binaire (https: // fr. wikipedia.org/wiki/Binary-coded_decimal). Je ne peux pas jurer que c'est ainsi que SQL Server stocke réellement la valeur, mais c'est une méthode très typique pour stocker des valeurs de points fixes dans d'autres langues. –
Merci Gordon pour le lien. Je regarderai. –
@GordonLinoff J'ai essayé, ne semble pas l'encodage BCD. –