PHP OCI, Oracle и числовой формат по умолчанию
Когда я выполняю выборку из базы данных Oracle, используя PHP OCI, числа, которые меньше 1, отображаются как .XXXXXX,
например .249999
, Есть ли способ установить это 0.XXXXXX
или в любой другой формат, без изменения каждого запроса для использования to_char()
явно? (Возможно, через некоторые параметры сеанса?)
4 ответа
Не существует способа сделать то, что вы просите, за исключением изменения исходного кода расширения php/oci. Причина такого поведения заключается в том, что oracle oci пропускает 0 в результатах, а php преобразует все результаты из oci в строки без выполнения приведения в зависимости от типа данных столбца. Даже результаты в SQL*Plus по умолчанию опускают 0, а форматирование SQL*Plus должно вызываться с помощью set numformat
настроить форматирование столбца и добавить нули.
В настоящее время нет параметра alter session, который вы можете установить, чтобы изменить это поведение.
Наиболее распространенный способ обойти это - использовать обертку вокруг ваших запросов и проверять числовые столбцы с помощью is_numeric
а затем отформатируйте числовые значения столбца с number_format
или же sprintf
, Надеемся, что ваше приложение уже использует оболочку для стандартных функций php oci, чтобы вы могли внести изменения в одном месте.
Используя PHP, вы можете легко добавить 0, конвертировав во float:
$a = '.249999';
echo (float) $a;
Это означает, что вы можете конвертировать свой номер по
$row['number'] = (float) $row['number'];
после получения его из БД.
Если вам нужно исправить десятичные числа в нескольких строках, вот функция для ее решения.
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;
}