2011-01-11 24 views
6

Estoy escribiendo un script PHP para importar datos a una base de datos MYSQL desde una base de datos Microsoft SQL Server 2008.¿Por qué obtengo caracteres no válidos al convertir datos MS SQL a MYSQL?

El servidor MSSQL se establece con una intercalación de "SQL_Latin1_General_CP1_CI_AS" y los datos en cuestión se almacenan en una columna del tipo "nchar".

páginas web Mi PHP utilizan

<meta http-equiv="content-type" content="text/html; charset=utf-8"> 

para indicar que se debe mostrar con UTF-8 codificación de caracteres.

Estoy extrayendo los datos de la base de datos MSSQL usando la extensión PHP sqlsrv.

$sql = 'SELECT * FROM [tArticle] WHERE [ID] = 6429'; 
$stmt = &sqlsrv_query($dbHandler, $sql); 

while ($row = sqlsrv_fetch_object($stmt)) { 
    // examples of what I've tried simply to display the data 
    echo $row->Text1; 
    echo utf8_encode($row->Text1); 
    echo iconv("ISO-8859-1", "UTF-8", $row->Text1); 
    echo iconv("ISO-8859-1", "UTF-8//TRANSLIT", $row->Text1); 
} 

Olvídese de insertar los datos en la base de datos MYSQL por el momento. No puedo hacer que la cadena se muestre correctamente en mi página PHP. A partir de los ejemplos en mi lista:

echo $row->Text1 

se representa por el navegador como un evidente carácter no válido: "Lucy"

todos los ejemplos siguientes que uno se representan como espacios en blanco: "Lucy"

Parece un problema de ajuste de conjunto de caracteres pero ¿cómo puedo obtener esta información para que se muestre correctamente desde la base de datos MS SQL (sin cambiar la codificación de mi página web)? Si puedo resolver eso probablemente pueda resolver el almacenamiento en la parte de la base de datos MYSQL.

+0

No he trabajado con sqlsrv pero es posible que tenga que configurar su codificación conexión al conectarse a la base de datos. El equivalente a ejecutar 'SET NAMES utf8' en mysql después de conectarse. – Fanis

Respuesta

13

Si las cadenas en la base de datos fuente están codificadas en UTF-8, debe usar utf8_decode, no utf8_encode.

Pero probablemente están codificados en algún latín u "occidental" Windows code page. Entonces probaría iconv("CP1252", "UTF-8", $row->Text1);, por ejemplo.

Otra alternativa es ejecutar una consulta SQL que establezca explícitamente una codificación conocida. Por ejemplo, según la documentación Windows Collation Name (Transact-SQL), esta consulta usaría la página de códigos 1252 para codificar el campo Texto1: SELECT Text1 COLLATE SQL_Latin1_General_CP1_CI_AS FROM ....

+1

iconv con "CP1252" hizo el truco que es extraño para mí ya que la documentación de MS en el campo "nchar" afirma que es un campo Unicode codificado con el juego de caracteres UCS-2. Gracias por la solución! – rushinge

7

tratar este comando que está funcionando para mí:

$connectionInfo = array("Database"=>"DBName", "CharacterSet" =>"UTF-8"); 
+0

Muchas gracias ... ¡me salvaste el día! –

Cuestiones relacionadas