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

下载 PHP 驱动程序

为了保持准确性,十进制或数字类型始终以精确精度和数值范围的字符串形式提取。 如果任何值小于 1,则缺少前导零。 money 和 smallmoney 字段也是如此,因为这些字段是固定数值范围等于 4 的十进制字段。

添加前导零(如果缺少)

从版本 5.6.0 开始,将选项 FormatDecimals 添加到 sqlsrv 连接和语句级别,这允许用户设置十进制字符串格式。 此选项需要一个布尔值(true 或 false),并且仅影响提取结果中的十进制值或数值的格式设置。 换言之,FormatDecimals 选项不会对其他操作(如插入或更新)产生影响。

默认情况下,FormatDecimals 为 false 。 如果设置为 true,则将为小于 1 的任何十进制值添加前导零到十进制字符串。

配置小数位数

打开 FormatDecimals 后,另一个选项 DecimalPlaces 允许用户在显示 money 和 smallmoney 数据时配置小数位数。 它接受 [0, 4] 范围内的整数值,在显示时可能会出现舍入。 但是,基础 money 数据保持不变。

这两个选项都可以设置为连接或语句级别,并且语句设置始终会重写相应的连接设置。 请注意,DecimalPlaces 选项仅影响 money 数据,并且 FormatDecimals 必须设置为 true 才能使 DecimalPlaces 生效。 否则,无论 DecimalPlaces 如何设置,都会关闭格式设置。

注意

由于 money 或 smallmoney 字段的数值范围为 4,因此将 DecimalPlaces 值设置为负数或大于 4 的任何值都将被忽略。 不建议使用任何格式化的 money 数据作为任何计算的输入。

示例 - 简单提取

下面的示例演示如何在简单提取中使用新选项。

<?php
$username = 'myusername';
$password = 'mypasword';
$tableName = 'mytable';

$connectionInfo = array("UID" => $username, "PWD" => $password, "Database" => "myDB", "FormatDecimals" => true);  
$server = "myServer";  // IP address also works
$conn = sqlsrv_connect( $server, $connectionInfo);  

$numDigits = 2;
$query = "SELECT money1 FROM $tableName";
$options = array("DecimalPlaces" => $numDigits);
$stmt = sqlsrv_prepare($conn, $query, array(), $options);
sqlsrv_execute($stmt);

if (sqlsrv_fetch($stmt)) {
    $field = sqlsrv_get_field($stmt, 0);  
    echo $field;   // expect a numeric value string with 2 decimal places
}

sqlsrv_free_stmt($stmt);
sqlsrv_close($conn);
?>

示例 - 设置输出参数的格式

如果 decimal 或 numeric 字段作为输出参数返回,则返回的值将被视为常规 varchar 字符串。 但是,如果指定了 SQLSRV_SQLTYPE_DECIMAL 或 SQLSRV_SQLTYPE_NUMERIC,则可以将 FormatDecimals 设置为 true,以确保数值字符串值不会缺少前导零。 有关详细信息,请参阅如何:使用 SQLSRV 驱动程序检索输出参数

下面的示例演示如何格式化返回十进制 (8,4) 值的存储过程的输出参数。

$outString = '';
$outSql = '{CALL myStoredProc(?)}';
$stmt = sqlsrv_prepare($conn, 
                       $outSql, 
                       array(array(&$outString, SQLSRV_PARAM_OUT, null, SQLSRV_SQLTYPE_DECIMAL(8, 4))),
                       array('FormatDecimals' => true));

if (sqlsrv_execute($stmt)) {
    echo $outString;  // expect a numeric value string with no missing leading zero
}

另请参阅

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

检索数据