Como enviar e recuperar dados UTF-8 utilizando o suporte UTF-8 do Built-In

Descarregar o driver PHP

Se estiveres a usar o driver PDO_SQLSRV, podes especificar a codificação com o atributo PDO::SQLSRV_ATTR_ENCODING. Para mais informações, consulte Constantes (Microsoft Drivers for PHP for SQL Server).

O restante deste tópico discute a codificação com o driver SQLSRV.

Para enviar ou recuperar dados codificados em UTF-8 para o servidor:

  1. Certifique-se de que a coluna de origem ou destino é do tipo nchar ou nvarchar.

  2. Especifique o tipo PHP como SQLSRV_PHPTYPE_STRING('UTF-8') no array de parâmetros. Ou, especificar "CharacterSet" => "UTF-8" como opção de ligação.

    Quando especificas um conjunto de caracteres como parte das opções de ligação, o driver assume que as outras cadeias de opções de ligação usam esse mesmo conjunto de caracteres. Assume-se também que o nome do servidor e as cadeias de consulta usam o mesmo conjunto de caracteres.

Podes passar UTF-8 ou SQLSRV_ENC_CHAR ao CharacterSet, mas não podes passar SQLSRV_ENC_BINARY. A codificação padrão é SQLSRV_ENC_CHAR.

Exemplo de ligação

O exemplo seguinte demonstra como enviar e recuperar dados codificados em UTF-8, especificando o conjunto de caracteres UTF-8 ao fazer a ligação. O exemplo atualiza a coluna Comentários da tabela Production.ProductReview para um ID de avaliação especificado. O exemplo também recupera os dados recentemente atualizados e os apresenta. Note que a coluna de Comentários é do tipo nvarchar(3850). Note também que, antes de os dados serem enviados para o servidor, estes são convertidos para codificação UTF-8 usando a função PHP utf8_encode . Isto é feito apenas para fins de demonstração. Num cenário real de aplicação, começaria com dados codificados em UTF-8.

O exemplo assume que o SQL Server e a base de dados AdventureWorks estão instalados no computador local. Toda a saída é escrita no navegador quando o exemplo é executado a partir do navegador.

<?php  
  
// Connect to the local server using Windows Authentication and  
// specify the AdventureWorks database as the database in use.   
//   
$serverName = "<server>";  
$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 informações sobre como armazenar dados Unicode, consulte Trabalhar com Dados Unicode.

Exemplo de coluna

O exemplo seguinte é semelhante ao primeiro exemplo, mas em vez de especificar o conjunto de caracteres UTF-8 na ligação, este exemplo mostra como especificar o conjunto de caracteres UTF-8 na coluna.

<?php  
  
// Connect to the local server using Windows Authentication and  
// specify the AdventureWorks database as the database in use.   
//   
$serverName = "<server>";  
$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);  
?>