Compartir a través de


Cómo enviar y recuperar datos UTF-8 mediante la compatibilidad integrada con UTF-8

La compatibilidad con caracteres UTF-8 se ha agregado en la versión 1.1 del Controlador de SQL Server para PHP.

En la versión 1.0 del Controlador de SQL Server para PHP, era necesario convertir manualmente en la codificación UTF-8, y viceversa, con la función iconv. Para obtener más información, vea Cómo convertir en datos UTF-8 y viceversa.

Para enviar o recuperar datos con codificación UTF-8 en el servidor:

  1. Asegúrese de que la columna de origen o de destino es de tipo nchar o nvarchar.
  2. Especifique el tipo de PHP como SQLSRV_PHPTYPE_STRING('UTF-8') en la matriz de parámetros. También pude especificar "CharacterSet" => "UTF-8" como opción de conexión.
    Si especifica un juego de caracteres como parte de las opciones de conexión, el controlador asume que las demás cadenas de opción de conexión usan el mismo juego de caracteres. También se asume que el nombre de servidor y las cadenas de consulta usan el mismo juego de caracteres.

Tenga en cuenta que puede pasar UTF-8 o SQLSRV_ENC_CHAR a CharacterSet (no se puede pasar SQLSRV_ENC_BINARY). La codificación predeterminada es SQLSRV_ENC_CHAR.

Ejemplo

En el siguiente ejemplo se muestra cómo enviar y recuperar datos con codificación UTF-8 especificando el juego de caracteres UTF-8 al establecer la conexión. En el ejemplo se actualiza la columna Comments de la tabla Production.ProductReview para un identificador de revisión especificado. En el ejemplo también se recuperan los datos recién actualizados y se muestran. Tenga en cuenta que la columna Comments es de tipo nvarcahr(3850). Además, observe que antes de que se envíen los datos al servidor se convierten a codificación UTF-8 mediante la función utf8_encode de PHP. Esto se realiza únicamente con fines de demostración. En un escenario real se comenzaría con datos con codificación UTF-8.

En el ejemplo se supone que SQL Server y la base de datos AdventureWorks están instalados en el equipo local. Cuando se ejecuta el ejemplo desde el explorador, todos los resultados se escriben en el explorador.

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

Para obtener información acerca de cómo almacenar datos Unicode, vea Trabajar con datos Unicode.

El siguiente ejemplo es parecido al primero, pero en lugar de especificar el juego de caracteres UTF-8 en la conexión, se muestra cómo especificarlo en la columna.

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

Vea también

Tareas

Aplicación de ejemplo

Conceptos

Constantes SQLSRV

Otros recursos

Recuperar datos
Actualizar datos (Controlador de SQL Server para PHP)
Referencia de la API (Controlador SQL Server para PHP)