Gewusst wie: Senden und Abrufen von UTF-8-Daten mit der integrierten UTF-8-Unterstützung

Die Unterstützung für UTF-8-Zeichen wurde in Version 1.1 des SQL Server-Treiber für PHP hinzugefügt.

In Version 1.0 des SQL Server-Treiber für PHP musste mit der iconv-Funktion manuell in und aus UTF-8 konvertiert werden. Weitere Informationen finden Sie unter Gewusst wie: Konvertieren in und aus UTF-8-Daten.

So senden Sie UTF-8-codierte Daten an den Server oder rufen diese ab

  1. Stellen Sie sicher, dass die Quell- oder Zielspalte vom Typ nchar oder nvarchar ist.
  2. Geben Sie den PHP-Typ als SQLSRV_PHPTYPE_STRING('UTF-8') im Parameterarray an. Alternativ können Sie "CharacterSet" => "UTF-8" als Verbindungsoption angeben.
    Wenn Sie einen Zeichensatz als Teil der Verbindungsoptionen angeben, geht der Treiber davon aus, dass die anderen Verbindungsoptionen-Zeichenfolgen denselben Zeichensatz verwenden. Bei dem Servernamen und den Abfragezeichenfolgen wird ebenfalls von der Verwendung desselben Zeichensatzes ausgegangen.

Beachten Sie, dass Sie UTF-8 oder SQLSRV_ENC_CHAR an CharacterSet übergeben können. (SQLSRV_ENC_BINARY kann nicht übergeben werden.) Die Standardcodierung ist SQLSRV_ENC_CHAR.

Beispiel

Das folgende Beispiel veranschaulicht, wie UTF-8-codierte Daten gesendet und abgerufen werden, indem beim Herstellen der Verbindung der UTF-8-Zeichensatz angegeben wird. In diesem Beispiel wird für den angegebenen ProductReviewID-Wert die Comments-Spalte in der Production.ProductReview-Tabelle aktualisiert. In diesem Beispiel werden die neu aktualisierten Daten auch abgerufen und angezeigt. Beachten Sie, dass die Comments-Spalte vom Typ nvarcahr(3850) ist. Zudem ist zu beachten, dass die Daten mit der PHP-Funktion utf8_encode in die UTF-8-Codierung konvertiert werden, bevor sie an den Server gesendet werden. Dies geschieht lediglich zu Demonstrationszwecken. In einem echten Anwendungsszenario würde mit den UTF-8-codierten Daten begonnen.

Im Beispiel wird davon ausgegangen, dass SQL Server und die AdventureWorks-Datenbank auf dem lokalen Computer installiert sind. Alle Ausgaben werden an den Browser ausgegeben, wenn das Beispiel über den Browser ausgeführt wird.

<?php

// Connect to the local server using Windows Authentication and
// specify the AdventureWorks database as the database in use. 
// 
$serverName = "MyServer";
$connectionInfo = array( "Database"=>"AdventureWorks", "CharacterSet" => "UTF-8");
$conn = sqlsrv_connect( $serverName, $connectionInfo);

if ( $conn === false ) {
   echo "Could not connect.<br>";
   die( print_r( sqlsrv_errors(), true));
}

// Set up the Transact-SQL query.
// 
$tsql1 = "UPDATE Production.ProductReview
          SET Comments = ?
          WHERE ProductReviewID = ?";

// Set the parameter values and put them in an array. Note that
// $comments is converted to UTF-8 encoding with the PHP function
// utf8_encode to simulate an application that uses UTF-8 encoded data. 
// 
$reviewID = 3;
$comments = utf8_encode("testing 1, 2, 3, 4.  Testing.");
$params1 = array(
                  array( $comments, null ),
                  array( $reviewID, null )
                );

// Execute the query.
// 
$stmt1 = sqlsrv_query($conn, $tsql1, $params1);

if ( $stmt1 === false ) {
   echo "Error in statement execution.<br>";
   die( print_r( sqlsrv_errors(), true));
}
else {
   echo "The update was successfully executed.<br>";
}

// Retrieve the newly updated data.
// 
$tsql2 = "SELECT Comments 
          FROM Production.ProductReview 
          WHERE ProductReviewID = ?";

// Set up the parameter array.
// 
$params2 = array($reviewID);

// Execute the query.
// 
$stmt2 = sqlsrv_query($conn, $tsql2, $params2);
if ( $stmt2 === false ) {
   echo "Error in statement execution.<br>";
   die( print_r( sqlsrv_errors(), true));
}

// Retrieve and display the data. 
// 
if ( sqlsrv_fetch($stmt2) ) {
   echo "Comments: ";
   $data = sqlsrv_get_field( $stmt2, 0 );
   echo $data."<br>";
}
else {
   echo "Error in fetching data.<br>";
   die( print_r( sqlsrv_errors(), true));
}

// Free statement and connection resources.
// 
sqlsrv_free_stmt( $stmt1 );
sqlsrv_free_stmt( $stmt2 );
sqlsrv_close( $conn);
?>

Weitere Informationen zum Speichern von Unicode-Daten finden Sie unter Arbeiten mit Unicode-Daten.

Das folgende Beispiel ähnelt dem ersten Beispiel. Anstatt jedoch den UTF-8-Zeichensatz für die Verbindung anzugeben, zeigt dieses Beispiel, wie der UTF-8-Zeichensatz in der Spalte angegeben wird.

<?php

// Connect to the local server using Windows Authentication and
// specify the AdventureWorks database as the database in use. 
// 
$serverName = "MyServer";
$connectionInfo = array( "Database"=>"AdventureWorks");
$conn = sqlsrv_connect( $serverName, $connectionInfo);

if ( $conn === false ) {
   echo "Could not connect.<br>";
   die( print_r( sqlsrv_errors(), true));
}

// Set up the Transact-SQL query.
// 
$tsql1 = "UPDATE Production.ProductReview
          SET Comments = ?
          WHERE ProductReviewID = ?";

// Set the parameter values and put them in an array. Note that
// $comments is converted to UTF-8 encoding with the PHP function
// utf8_encode to simulate an application that uses UTF-8 encoded data. 
// 
$reviewID = 3;
$comments = utf8_encode("testing");
$params1 = array(
                  array($comments,
                        SQLSRV_PARAM_IN,
                        SQLSRV_PHPTYPE_STRING('UTF-8')
                  ),
                  array($reviewID)
                );

// Execute the query.
// 
$stmt1 = sqlsrv_query($conn, $tsql1, $params1);

if ( $stmt1 === false ) {
   echo "Error in statement execution.<br>";
   die( print_r( sqlsrv_errors(), true));
}
else {
   echo "The update was successfully executed.<br>";
}

// Retrieve the newly updated data.
// 
$tsql2 = "SELECT Comments 
          FROM Production.ProductReview 
          WHERE ProductReviewID = ?";

// Set up the parameter array.
// 
$params2 = array($reviewID);

// Execute the query.
// 
$stmt2 = sqlsrv_query($conn, $tsql2, $params2);
if ( $stmt2 === false ) {
   echo "Error in statement execution.<br>";
   die( print_r( sqlsrv_errors(), true));
}

// Retrieve and display the data. 
// 
if ( sqlsrv_fetch($stmt2) ) {
   echo "Comments: ";
   $data = sqlsrv_get_field($stmt2, 
                            0, 
                            SQLSRV_PHPTYPE_STRING('UTF-8')
                           );
   echo $data."<br>";
}
else {
   echo "Error in fetching data.<br>";
   die( print_r( sqlsrv_errors(), true));
}

// Free statement and connection resources.
// 
sqlsrv_free_stmt( $stmt1 );
sqlsrv_free_stmt( $stmt2 );
sqlsrv_close( $conn);
?>

Siehe auch

Aufgaben

Beispielanwendung

Konzepte

SQLSRV-Konstanten

Weitere Ressourcen

Abrufen von Daten
Aktualisieren von Daten (SQL Server-Treiber für PHP)
API-Referenz (SQL Server-Treiber für PHP)