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
- Stellen Sie sicher, dass die Quell- oder Zielspalte vom Typ nchar oder nvarchar ist.
- 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
Konzepte
Weitere Ressourcen
Abrufen von Daten
Aktualisieren von Daten (SQL Server-Treiber für PHP)
API-Referenz (SQL Server-Treiber für PHP)