Nous insérons des valeurs dans une colonne de base de données SQL Server 2005 de type NUMERIC (19,5) à partir de Perl. Tant que les valeurs absolues sont .0001 ou supérieur, cela fonctionne. Cependant, lorsque les valeurs vont à la 5ème décimale, Perl commence à les stocker au format exponentiel (-9e-05
au lieu de -0.00009
), puis l'erreur "Error converting data type varchar to numeric
" provient de SQL Server. Comment pouvons-nous empêcher cela et le faire insérer correctement de petites valeurs numériques?Pourquoi est-ce que j'obtiens «Erreur lors de la conversion du type de données varchar en numérique» sur un nombre à virgule flottante en Perl?
Nous utilisons v5.8.5 Perl, DBI 1,56, DBD :: Sybase 1,07 et SQL Server 2005.
Le code est à peu près ce qui suit, mais j'ai enlevé les champs étrangers:
$invoice->{IL_UNITPRICE} = 0.09; # Actually comes from another database
$invoice->{IL_PRICEUNITCONV} = 0.001; # Actually comes from another database
$unitprice = $invoice->{IL_UNITPRICE} * -1 * $invoice->{IL_PRICEUNITCONV};
#$unitprice equals -9e-05 at this point.
$sth = $dbh->prepare('INSERT INTO foo (bar) VALUES (?)');
$sth->execute($unitprice);
La ligne ci-dessus échoue avec l'erreur: DBD::Sybase::st execute failed: Server message number=8114 severity=16 state=5 line=2 server=baz text=Error converting data type varchar to numeric.
Il semble plutôt incommode de devoir rappeler les nombres à virgule flottante pour forcer le formatage correctement, plutôt que d'avoir le format à virgule flottante automatique de Perl correctement manipulé. – LeBleu
Oui, mais une décision de swith à la notation scientifique doit se produire à un point, et ils ont simplement choisi d'aller avec la valeur par défaut du compilateur. Pour en savoir plus, voir http://perldoc.perl.org/perlnumber.html –
la valeur par défaut de la bibliothèque C, pas celle du compilateur. – ysth