2008-10-07 10 views
5

Dans notre application Web, nous utilisons PHP5.2.6 + PDO pour nous connecter à une base de données SQL Server 2005 et stocker des textes en russe.Connexion PHP/PDO et SQL Server et problèmes i18n

Le classement de la base de données est Cyrillic_General_CI_AS, le classement de la table est Cyrillic_General_CI_AS, le type de colonne est NVARCHAR(MAX).

Nous avons essayé de nous connecter à une base de données en utilisant deux schémas suivants, les deux provoquant des problèmes différents.

  1. AOP MSSQL:

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

    auquel cas le résultat d'une requête simple comme ça:

    SELECT field1 FROM tbl1 WHERE id=1 
    

    montre field1 données tronquées à 255 octets.

  2. AOP odbc:

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

    auquel cas un résultat de la même requête affiche complet des données non tronquées, mais avec des points d'interrogation au lieu des symboles russes.


Notes:

  • Dans les données SQL Management Studio n'est pas des symboles tronqués et russes sont affichés correctement aussi bien.
  • Nous avons Windows 2003 Enterprise Edition SP2

Que devons-nous choisir comme méthode de connexion et comment résoudre les problèmes correspondants?

Répondre

2

Essayez d'exécuter SET NAMES "charset" après vous être connecté.

Je ne sais pas quel est le charset correspondant Cyrillic_General_CI_AS, mais essayez "Cyrillic"?

0

J'ai toujours eu la meilleure chance d'utiliser utf8_general_ci à travers le tableau - pour les connexions, les classements - tout.

Cependant, j'ai seulement cette expérience avec MySQL et PostgreSQL - pas avec SQL Server.

En ce qui concerne votre question DSN - je ne suis pas sûr.

Bonne chance!

+0

Merci pour votre réponse, mais le problème est definetely en PHP/AOP - parce que lorsque nous nous connectons à la même base de données .NET, tout fonctionne bien. –

0

Si vous n'êtes pas défini sur PDO, utilisez FreeTDS - aka procédural mssql_ * calls. Ceci est l'un des travaux recommandés autour de PDO est fixe. Depuis PHP 5.1.2, FreeTDS a un mssql.charset-option.

0

J'ai remarqué le même problème aussi, avec une implémentation de SQL Server 2005 et PHP 5.x utilisant PDO. Lorsque j'ai changé le champ nvarchar (MAX) en nvarchar (255), les caractères d'interrogation impairs ont cessé d'apparaître.Je crois vraiment que cela a à voir avec les pilotes ODBC dans PDO et MS SQL Server. Lorsque vous spécifiez implicitement les caractères max dans votre varchar, cela résout le problème.

1

je devais faire cela pour obtenir des données utilisables de mes champs NVARCHAR dans MSSQL:

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