Formatieren von Dezimalzeichenfolgen und Geldwerten (PDO_SQLSRV-Treiber)
Für maximale Genauigkeit werden Dezimal- oder numerische Typen immer als Zeichenfolgen mit der exakten Anzahl von Zeichen und Dezimalzeichen abgerufen. Wenn ein Wert geringer als 1 ist, fehlt die führende Null. Gleiches gilt für die Felder „money“ und „smallmoney“, da es sich um Dezimalfelder mit einer festen Anzahl von Dezimalzeichen (4) handelt.
Hinzufügen von fehlenden führenden Nullen
Ab Version 5.6.0 können Benutzer Dezimalzeichenfolgen über das Verbindungs- oder Anweisungsattribut PDO::SQLSRV_ATTR_FORMAT_DECIMALS
formatieren. Dieses Attribut wird mit einem booleschen Wert (true oder false) verwendet und wirkt sich ausschließlich auf die Formatierung der Dezimal- oder numerischen Werte in den abgerufenen Ergebnissen aus. Mit anderen Worten, es hat keine Auswirkungen auf andere Vorgänge wie beispielsweise Einfüge- oder Aktualisierungsvorgänge.
Standardmäßig ist PDO::SQLSRV_ATTR_FORMAT_DECIMALS
false. Bei Festlegung auf „true“ werden führende Nullen zu Dezimalzeichenfolgen hinzugefügt, wenn der Dezimalwert geringer als 1 ist.
Konfigurieren der Anzahl von Dezimalstellen
Wenn PDO::SQLSRV_ATTR_FORMAT_DECIMALS
aktiviert ist, können Benutzer das Verbindungs- oder Anweisungsattribut PDO::SQLSRV_ATTR_DECIMAL_PLACES
verwenden, um die Anzahl von Dezimalstellen bei money- und smallmoney-Daten zu konfigurieren. Für dieses Attribut können ganzzahlige Werte von 0-4 angegeben werden. Bei der Anzeige werden die Werte möglicherweise gerundet. Die zugrunde liegenden money-Daten werden jedoch nicht geändert.
Anweisungsattribute setzen die entsprechenden Verbindungseinstellungen stets außer Kraft. Beachten Sie, dass sich die Option PDO::SQLSRV_ATTR_DECIMAL_PLACES
ausschließlich auf money-Daten auswirkt und PDO::SQLSRV_ATTR_FORMAT_DECIMALS
auf „true“ festgelegt sein muss. Anderenfalls ist die Formatierung unabhängig von der Einstellung PDO::SQLSRV_ATTR_DECIMAL_PLACES
deaktiviert.
Hinweis
Da die Felder „money“ und „smallmoney“ über 4 Dezimalzeichen verfügen, wird PDO::SQLSRV_ATTR_DECIMAL_PLACES
ignoriert, wenn ein negativer Wert oder ein höherer Wert als 4 festgelegt wird. Es wird nicht empfohlen, formatierte money-Daten als Eingabe für Berechnungen zu verwenden.
Festlegen der Verbindungsattribute
So legen Sie Attribute für den Verbindungspunkt fest:
$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);
So legen Sie Attribute nach der Verbindung fest:
$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);
Beispiel: Formatieren von money-Daten
Das folgende Beispiel zeigt, wie money-Daten mithilfe von PDOStatement::bindColumn abgerufen werden:
<?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);
?>
Beispiel: Außerkraftsetzung von Verbindungsattributen
Das folgende Beispiel zeigt, wie Sie die Verbindungsattribute außer Kraft setzen:
<?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);
?>
Weitere Informationen
Formatieren von Dezimalzeichenfolgen und Geldwerten (SQLSRV-Treiber)