Formatieren von Dezimalzeichenfolgen und Geldwerten (PDO_SQLSRV-Treiber)

PHP-Treiber herunterladen

Um die Genauigkeit zu wahren, werden Dezimal- oder numerische Typen immer als Zeichenfolgen mit exakter Präzision und Skalierung 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.

Fehlende führende Nullen hinzufügen

Ab Version 5.6.0 können Benutzer Dezimalzeichenfolgen über das Verbindungs- oder Anweisungsattribut PDO::SQLSRV_ATTR_FORMAT_DECIMALS formatieren. Dieses Attribut erwartet einen booleschen Wert (true oder false) und wirkt sich nur auf die Formatierung der Dezimal- oder numerischen Werte in den abgerufenen Ergebnissen aus. Mit anderen Worten: Dieses Attribut hat keine Auswirkung auf andere Operationen wie Einfügen oder Aktualisieren.

Standardmäßig ist PDO::SQLSRV_ATTR_FORMAT_DECIMALSfalse. 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 mit einem weiteren Verbindungs- oder Anweisungsattribut, PDO::SQLSRV_ATTR_DECIMAL_PLACES, die Anzahl der Dezimalstellen bei der Anzeige von money- und smallmoney-Daten 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 Währungsdaten bleiben jedoch unverändert.

Anweisungsattribute setzen die entsprechenden Verbindungseinstellungen stets außer Kraft. Beachten Sie, dass sich die Option PDO::SQLSRV_ATTR_DECIMAL_PLACESausschließ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 = <server>; Database = <database>", $username, $password, $attrs);
    
  • Attribute nach dem Verbinden festlegen:

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

Beispiel – Gelddaten formatieren

Das folgende Beispiel zeigt, wie money-Daten mithilfe von PDOStatement::bindColumn abgerufen werden:

<?php
$database = "<database>";
$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 = '<database>';
$server = '<server>';
$username = '<user_id>';
$password = '<password>'

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