Formatieren von Dezimalzeichenfolgen und Geldwerten (PDO_SQLSRV-Treiber)

PHP-Treiber herunterladen

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_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 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_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 = 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)

Abrufen von Daten