Поделиться через


Форматирование десятичных строк и денежных значений (драйвер PDO_SQLSRV)

Скачать драйвер PHP

Чтобы сохранить точность, типы decimal или numeric всегда извлекаются как строки с особой точностью и масштабом. Если какое-либо значение меньше 1, начальный ноль отсутствует. Это аналогично полям money и smallmoney, так как они являются десятичными полями с фиксированным масштабом равным 4.

Добавление ведущих нулей, если они отсутствуют

Начиная с версии 5.6.0, атрибут подключения или инструкции PDO::SQLSRV_ATTR_FORMAT_DECIMALS позволяет пользователю форматировать десятичные строки. Этот атрибут принимает логическое значение (true или false) и влияет только на форматирование десятичных или числовых значений в результатах выборки. Иными словами, этот атрибут не влияет на другие операции, такие как вставка или обновление.

Значение PDO::SQLSRV_ATTR_FORMAT_DECIMALS по умолчанию — false. Если задано значение true, то начальные нули в десятичных строках будут добавлены для любого десятичного значения меньше 1.

Настройка числа десятичных знаков

Если PDO::SQLSRV_ATTR_FORMAT_DECIMALS включен, то атрибут подключения или выписки, PDO::SQLSRV_ATTR_DECIMAL_PLACES позволяет пользователям настраивать число десятичных знаков при отображении данных money и smallmoney. Он принимает целочисленные значения в диапазоне [0, 4] и может выполнять округление отображаемого числа. Однако базовые данные money остаются неизменными.

Атрибуты выписки всегда переопределяют соответствующие параметры соединения. Обратите внимание, что параметр PDO::SQLSRV_ATTR_DECIMAL_PLACES влияет только на данные money, а параметр PDO::SQLSRV_ATTR_FORMAT_DECIMALS должен быть со значением true. В противном случае форматирование отключается независимо от параметра PDO::SQLSRV_ATTR_DECIMAL_PLACES.

Примечание

Так как поля money или smallmoney имеют масштаб 4, то при установке значения PDO::SQLSRV_ATTR_DECIMAL_PLACES любое отрицательное число или любое значение больше 4, будет игнорироваться. Не рекомендуется использовать какие-либо отформатированные данные money в качестве входных данных для вычислений.

Установка атрибутов соединения

  • Задайте атрибуты в точке соединения:

    $attrs = array(PDO::SQLSRV_ATTR_FORMAT_DECIMALS => true,
                   PDO::SQLSRV_ATTR_DECIMAL_PLACES => 2);
    
    $conn = new PDO("sqlsrv:Server = myServer; Database = myDB", $username, $password, $attrs);
    
  • Задайте атрибуты после соединения:

    $conn = new PDO("sqlsrv:Server = myServer; Database = myDB", $username, $password);
    $conn->setAttribute(PDO::SQLSRV_ATTR_FORMAT_DECIMALS, true);
    $conn->setAttribute(PDO::SQLSRV_ATTR_DECIMAL_PLACES, 2);
    

Пример. Форматирование данных типа money

В следующем примере показано, как извлечь данные о денежных средствах с помощью PDOStatement::bindColumn:

<?php
$database = "myDB";
$server = "(local)";
$conn = new PDO( "sqlsrv:server=$server; Database = $database", "", "");
$conn->setAttribute(PDO::SQLSRV_ATTR_FORMAT_DECIMALS, true);

$numDigits = 3;
$query = "SELECT smallmoney1 FROM aTable";
$options = array(PDO::SQLSRV_ATTR_DECIMAL_PLACES => $numDigits);
$stmt = $conn->prepare($query, $options);
$stmt->execute();

$stmt->bindColumn('smallmoney1', $field);
$result = $stmt->fetch(PDO::FETCH_BOUND);
echo $field;    // expect a number string with 3 decimal places

unset($stmt);
unset($conn);
?>

Пример. Переопределение атрибутов соединения

В следующем примере показано, как переопределить атрибуты соединения.

<?php
$database = 'myDatabase';
$server = 'myServer';
$username = 'myuser';
$password = 'mypassword'

$conn = new PDO("sqlsrv:server=$server; Database = $database", $username, $password);
$conn->setAttribute(PDO::SQLSRV_ATTR_FORMAT_DECIMALS, true);
$conn->setAttribute(PDO::SQLSRV_ATTR_DECIMAL_PLACES, 2);

$query = 'SELECT smallmoney1 FROM testTable1';
$options = array(PDO::SQLSRV_ATTR_FORMAT_DECIMALS => false);
$stmt = $conn->prepare($query, $options);
$stmt->execute();

$stmt->bindColumn('smallmoney1', $field);
$result = $stmt->fetch(PDO::FETCH_BOUND);  
echo $field;   // expect a number string showing the original scale -- 4 decimal places

unset($stmt);
unset($conn);
?>

См. также:

Форматирование десятичных строк и денежных значений (драйвер SQLSRV)

Извлечение данных