设置十进制字符串和 Money 值格式(PDO_SQLSRV 驱动程序)

下载 PHP 驱动程序

为了保持准确性,十进制或数字类型始终以精确精度和数值范围的字符串形式提取。 如果任何值小于 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 提取 money 数据:

<?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);
?>

另请参阅

设置十进制字符串和 Money 值格式(SQLSRV 驱动程序)

检索数据