2008-10-07 27 views
5

En nuestra aplicación web usamos PHP5.2.6 + PDO para conectarnos a una base de datos de SQL Server 2005 y almacenar textos rusos.Conexión de PHP/PDO y SQL Server y problemas de i18n

La intercalación de la base de datos es Cyrillic_General_CI_AS, la intercalación de tablas es Cyrillic_General_CI_AS, el tipo de columna es NVARCHAR(MAX).

Intentamos conectarnos a una base de datos usando dos esquemas siguientes, ambos causando problemas diferentes.

  1. PDO mssql:

    $dbh = new PDO ('mssql:host='.$mssql_server.';dbname='.$mssql_db, $mssql_login, $mssql_pwd); 
    

    en cuyo caso un resultado de una consulta simple como que:

    SELECT field1 FROM tbl1 WHERE id=1 
    

    muestra field1 datos truncados a 255 bytes.

  2. PDO ODBC:

    $dbh = new PDO ('odbc:DSN=myDSN;UID='.$mssql_login.';PWD='.$mssql_pwd); 
    

    en cuyo caso el resultado de la misma consulta muestra completos datos no truncados, pero con signos de interrogación en vez de símbolos rusos.


Notas:

  • En los datos de SQL Management Studio es No símbolos truncados y rusos se muestran correctamente así.
  • Tenemos Windows 2003 Enterprise Edition SP2

Entonces, ¿qué debemos elegir como método de conexión y cómo solucionar los problemas correspondientes?

Respuesta

2

Intente ejecutar SET NAMES "charset" después de conectarse.

No sé para qué sirve el juego de caracteres Cyrillic_General_CI_AS, pero prueba "cirílico"?

0

Siempre he tenido la mejor suerte usando utf8_general_ci en general, para conexiones, colaciones, todo.

Sin embargo, solo tengo esa experiencia con MySQL y PostgreSql, no con SQL Server.

En cuanto a su pregunta de DSN, no estoy seguro.

¡Buena suerte!

+0

Gracias por su respuesta, pero el problema es definitivamente en PHP/DOP - porque cuando nos conectamos a la misma base de datos en .NET, todo funciona bien. –

0

Si no está configurado en PDO, use FreeTDS - aka llamadas procedurales mssql_ *. Esta es una de las soluciones de trabajo recomendadas hasta que PDO sea fijo. Desde PHP 5.1.2, FreeTDS tiene un mssql.charset-option.

0

Me di cuenta del mismo problema también, con una implementación de SQL Server 2005 y PHP 5.x usando PDO. Cuando cambié el campo nvarchar (MAX) a nvarchar (255), los caracteres impares de interrogación dejaron de aparecer.Definitivamente creo que tiene que ver con los controladores ODBC en los servidores PDO y MS SQL. Cuando especifica implícitamente los caracteres máximos en su varchar, resuelve el problema.

1

que tenía que hacer esto para obtener datos utilizables de mis campos NVARCHAR en MSSQL:

$_ = iconv('Windows-1252', 'UTF-8', $_);