PHP OCI、Oracle和默认数字格式

PHP OCI、Oracle和默认数字格式,php,oracle,formatting,oracle-call-interface,Php,Oracle,Formatting,Oracle Call Interface,当我使用PHP OCI从Oracle数据库执行提取时,小于1的数字显示为.XXXXXX,,例如.249999。有没有办法将其设置为0.XXXXXX或任何其他格式,而无需修改每个查询以明确使用to_char()?(可能通过一些会话参数?使用PHP,您可以通过转换为float轻松添加0: $a = '.249999'; echo (float) $a; 也就是说,你可以通过 $row['number'] = (float) $row['number']; 在从数据库中获取它之后。除了修改php/

当我使用PHP OCI从Oracle数据库执行提取时,小于1的数字显示为
.XXXXXX,
,例如
.249999
。有没有办法将其设置为
0.XXXXXX
或任何其他格式,而无需修改每个查询以明确使用
to_char()
?(可能通过一些会话参数?

使用PHP,您可以通过转换为float轻松添加0:

$a = '.249999';
echo (float) $a;
也就是说,你可以通过

$row['number'] = (float) $row['number'];

在从数据库中获取它之后。

除了修改php/oci扩展源代码之外,没有任何方法可以满足您的全局要求。这种行为的原因是因为oracle oci在结果中省略了0,php将oci中的所有结果转换为字符串,而不根据列数据类型执行任何强制转换。默认情况下,甚至会导致SQL*Plus忽略0,并且必须使用
set numformat
调用SQL*Plus格式来自定义列格式并预先设置0s

当前没有可以设置的alter session参数来更改此行为


解决此问题的最常用方法是在查询周围使用包装器,并使用
is\u numeric
检查数字列,然后使用
number\u format
sprintf
格式化数字列值。希望您的应用程序已经使用了一个包装器来包装库存php oci函数,这样您就可以在一个位置进行更改。

如果您需要在多行中修复小数,这里有一个函数来解决这个问题

function fixDecimalNumbers(array $fetchedDataset)
{
    //workaround for Oracle driver not returning leading zero on decimal numbers between -1 and 1 -.-
    foreach($fetchedDataset as $rownum => $row){
        foreach($row as $column => $value) {
            if(substr( $value, 0, 2 ) === '-,' && is_numeric(substr( $value, 2, 1 ))){
                $row[$column] = '-0' . substr( $value, 1);
                error_log($column);
                error_log($value);
            }
            else if(substr( $value, 0, 1 ) === ',' && is_numeric(substr( $value, 1, 1 ))){
                $row[$column] = '0' . $value;
            }
        }
        $fetchedDataset[$rownum] = $row;
    }
    return $fetchedDataset;
}

谢谢你的回答,但我正在寻找一种在全球范围内改变它的方法。我们有许多需要更改的查询,这将是太多的工作。甚至有一个“错误报告”用于此