將十進位字串及貨幣值格式化 (PDO_SQLSRV 驅動程式)
為了維持正確性,decimal 或 numeric 類型一律是以完全符合的精確度與小數位數擷取為字串。 如果任何值小於 1,則會遺漏前置零。 money 和 smallmoney 欄位也是如此,因為其為小數位數固定為 4 的 decimal 欄位。
若遺漏前置零則加以新增
從 5.6.0 版開始,連線或陳述式屬性 PDO::SQLSRV_ATTR_FORMAT_DECIMALS
允許使用者對小數字串進行格式設定。 此屬性預期的是布林值 (true 或 false),且只影響所擷取結果中 decimal 或 numeric 值的格式設定。 換句話說,此屬性不影響插入或更新等其他作業。
根據預設,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);
?>