décembre
2011
Suite à une question posée sur le forum ici voici une tentative d’explication du problème constaté et des pistes de contournement.
D’abord un petit rappel sur les types float/real et decimal et numéric
–> float et real
float et real sont des types de données approximatives à utiliser avec des données numériques à virgule flottante. Les données à virgule flottante sont approximatives ; il n’est donc pas possible de représenter précisément toutes les valeurs de ce type de données.
–> decimal et numéric
decimal et numéric sont des types de données numériques ayant une précision et une échelle fixes.
=> Problème
(mon contexte : SQL SERVER 2008R2 – WINXP Pro)
(
col1 real,
col2 decimal(10,3)
)
INSERT INTO test (col1, col2) VALUES (123.65,56983.256)
SELECT * FROM test
–> Sortie
------ ---------
123,65 56983.256
Pourquoi cette sortie avec ‘,’ pour col1 (type real) et ‘.’ pour col2 (type decimal) alors que sous SQL SERVER 2000 la même requête sorte des valeurs avec des points pour les deux types de données ?
=> Tentative d’explication
Une explication à ce problème d’affichage se trouve dans les options régionales de l’OS.
Panneau de configuration > Options régionales > Options régionales et linguistiques
sous l’onglet « Options régionales » cliquer sur le bouton « Personnaliser »
(PS. je suis sous WINDOWS XP Pro)
c’est justement cette virgule qui fait que la sortie du type real apparaît avec une virgule. Pour afficher la sortie de la valeur real avec un point il suffit de positionner l’option symbole decimal sur le point pour voir la sortie du type real avec un point (.)
ainsi on a le résultat suivant :
------ ---------
123.65 56983.256
De même on peut paramétrer depuis cette même fenêtre le nombre de chiffres à afficher après la virgule (Nombre de décimmal), ….
=> Contournement
Pour contourner ces problèmes d’affichage sans toucher aux options régionales de l’OS, on peut utiliser les fonctions de conversions T-SQL CAST ou CONVERT conjointement avec la fonction REPLACE
–> Affichage avec des virgules (,)
SELECT REPLACE(cast(col1 AS numeric(10,2)),'.',',') col1, REPLACE(col2,'.',',')col2 FROM test
–> Affichage avec des points (.)
Voilà !
Happy query
——————–
Etienne ZINZINDOHOUE
——————–