Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 为什么我会得到';将数据类型varchar转换为数字时出错';关于Perl中的浮点数?_Sql Server_Sql Server 2005_Perl_Dbi - Fatal编程技术网

Sql server 为什么我会得到';将数据类型varchar转换为数字时出错';关于Perl中的浮点数?

Sql server 为什么我会得到';将数据类型varchar转换为数字时出错';关于Perl中的浮点数?,sql-server,sql-server-2005,perl,dbi,Sql Server,Sql Server 2005,Perl,Dbi,我们正在从Perl向SQL Server 2005数据库的NUMERIC(19,5)类型列中插入值。只要绝对值为.0001或更大,它就工作。但是,当值到达小数点后5位时,Perl开始以指数格式存储它们(-9e-05,而不是-0.00009),然后我们从SQL Server获得错误“将数据类型varchar转换为数字时出错”。我们如何防止这种情况并使其正确插入小数值 我们使用的是PerlV5.8.5、DBI1.56、DBD::Sybase 1.07和SQLServer2005 代码大致如下,但我已

我们正在从Perl向SQL Server 2005数据库的NUMERIC(19,5)类型列中插入值。只要绝对值为.0001或更大,它就工作。但是,当值到达小数点后5位时,Perl开始以指数格式存储它们(
-9e-05
,而不是
-0.00009
),然后我们从SQL Server获得错误“
将数据类型varchar转换为数字时出错”。我们如何防止这种情况并使其正确插入小数值

我们使用的是PerlV5.8.5、DBI1.56、DBD::Sybase 1.07和SQLServer2005

代码大致如下,但我已删除了无关字段:

$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);
上面的行失败并出现错误:
DBD::Sybase::st execute failed:Server message number=8114 severity=16 state=5 line=2 Server=baz text=将数据类型varchar转换为数字时出错。
请重试

$sth->execute(sprintf("%.6f",$unitprice));
展开一位——当您通过DBi接口传递本机float/double时,它会被转换为字符串,如果不另行指定,则使用Perl的默认格式约定(由C编译器强制)。默认值为6位精度,如果数字的精度超过6位,则以科学记数法表示


要获得定点格式,您必须使用sprintf明确地请求它。

实际上,我认为使用及其关联的Math::BigFloat也可以解决这个问题。每当我使用浮点数或足够大的数字时,我都会使用这些模块,这样我就不必到处乱扔sprintf,除非我真的想控制格式。

我必须记住强制浮点数正确格式化似乎很不方便,而不是正确处理Perl的自动浮点格式。是的,但是必须在某个时候决定转换为科学符号,他们只是选择使用编译器的默认值。有关更多信息,请参阅C库的默认值,而不是编译器的默认值。我认为DBI更应该处理识别它仍然是一个数字的问题,而不是试图将其作为字符串发送到SQL server,而不是反对科学记数法。