Partager via


Procédure : envoyer et récupérer des données UTF-8 grâce à la prise en charge UTF-8 intégrée

La prise en charge des caractères UTF-8 est une nouveauté de la version 1.1 du Pilote SQL Server pour PHP.

Dans la version 1.0 du Pilote SQL Server pour PHP, vous deviez convertir manuellement les données depuis et vers UTF-8 avec la fonction iconv. Pour plus d'informations, consultez Procédure : convertir des données UTF-8.

Pour envoyer ou récupérer des données au format UTF-8 sur le serveur :

  1. Assurez-vous que la colonne source ou de destination est de type nchar ou nvarchar.
  2. Spécifiez le type PHP SQLSRV_PHPTYPE_STRING('UTF-8') dans le tableau de paramètres. Ou spécifiez "CharacterSet" => "UTF-8" en tant qu'option de connexion.
    Lorsque vous spécifiez un jeu de caractères dans le cadre des options de connexion, le pilote assume que les autres chaînes des options de connexion utilisent également ce jeu de caractères. Les chaînes de nom de serveur et de requête sont également supposées utiliser ce jeu de caractères.

Notez que vous pouvez passer UTF-8 ou SQLSRV_ENC_CHAR à CharacterSet, mais que vous ne pouvez pas passer SQLSRV_ENC_BINARY. SQLSRV_ENC_CHAR est l'encodage par défaut.

Exemple

L'exemple suivant montre comment envoyer et récupérer des données au format UTF-8 en spécifiant le jeu de caractères UTF-8 au moment de l'établissement de la connexion. L'exemple met à jour la colonne Comments de la table Production.ProductReview pour un ID de comparatif spécifique. Ensuite, il récupère les nouvelles données mises à jour et les affiche. Notez que la colonne Comments est du type nvarcahr(3850). Notez également que les données sont converties au format UTF-8 par la fonction PHP utf8_encode avant leur envoi au serveur. Ceci est présenté uniquement à des fins de démonstration. Dans un scénario d'application réel, les données sont initialement au format UTF-8.

L'exemple suppose que SQL Server et la base de données AdventureWorks sont installés sur l'ordinateur local. Toutes les données de sortie sont écrites dans le navigateur lorsque l'exemple est exécuté à partir de ce dernier.

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

Pour plus d'informations sur le stockage de données Unicode, consultez Utilisation des données Unicode.

L'exemple ci-dessous est similaire au premier, mais au lieu de spécifier le jeu de caractères UTF-8 au moment de la connexion, il montre comment l'indiquer dans la colonne.

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

Voir aussi

Tâches

Exemple d'application

Concepts

Constantes SQLSRV

Autres ressources

Récupération des données
Mise à jour des données (pilote SQL Server pour PHP)
Référence de l'API (Pilote SQL Server pour PHP)