IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Ecrire et lire des données Unicode dans MSSQL 2005


Sujet :

PHP & Base de données

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    306
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 306
    Points : 194
    Points
    194
    Par défaut Ecrire et lire des données Unicode dans MSSQL 2005
    Hello,

    Je galère depuis quelques jours pour pouvoir dialoguer en Unicode avec ma base Sql Server.

    Configuration :
    PHP exécuté sur un serveur Linux avec freetds d'installé. En face, base SQL Server 2005 sur un Windows.

    Conf Freetds :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    [ma_connexion_utf8]
            host = mon_hote_sql
            port = 1433
            client charset = UTF-8
            tds version = 7
    Ma page PHP est en Unicode, et je fais une requête de ce type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    $params = array(
    	'host'		=>'ma_connexion_utf8',
    	'pdoType'	=>'dblib',
    	'dbname'	=>'MA_BASE',
    	'username'	=>'mon_login',
    	'password'	=>'mon_password'			
    );
     
    $db = Zend_Db::factory('Pdo_Mssql', $params);
     
    $sql   = "INSERT INTO... VALUES ('1',N'éâtôtà','6655'...
     
    $stmt = new Zend_Db_Statement_Pdo($db, $sql);
    Mes champs sont en NVARCHAR en base.

    Quand je regarde le contenu de ma table vi SQL Server Managment Studio Express, mes données ressemblent à :
    éâtôtÃ*

    Est-ce que j'aurais oublié de paramétrer un truc ?

    Merci de votre aide.

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    306
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 306
    Points : 194
    Points
    194
    Par défaut
    Hello,

    Je complète mon post:

    Je viens de tester la même requête mais à partir d'un poste windows cette fois-ci (avec easyphp) et je rencontre le même problème.

    Ca ne semble donc pas être le driver freetds qui soit en cause.

    Je pencherai plus sur la conf sql server mais je n'ai pas trouvé d'options de ce genre ?

    Est-ce que l'un d'entre a déjà écrit de l'unicode dans une base sql server 2000 ou 2005 (mon cas) ? Si oui avez-vous rencontré des problèmes ou c'est passé nickel?

  3. #3
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Il faut déjà que le serveur/base/table/champ (?) soient configurés en Unicode.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    306
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 306
    Points : 194
    Points
    194
    Par défaut
    Merci pour ta réponse.

    A ma connaissance, au niveau SQL server 2005, la seule chose à prendre en compte pour gérer de l'unicode est le type de la colonne qui doit être du type nvarchar u nchar ou ntext et c'est ce que j'ai fait.

  5. #5
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Personnellement j'avais utilisé les fonction utf8_decode/encode pour communiquer avec SQL serveur mais je n'avais pas possibilité de modifier sa config.
    Il existe peut etre un moyen de le faire communiquer avec PHP directement en UTF8 mais il n'y a vraiment pas d'infos la dessus sur le net.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    306
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 306
    Points : 194
    Points
    194
    Par défaut
    Les string que j'envoie au server sont bien en unicode (je fais la conversion avant).

  7. #7
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Justement moi j'avais été obligé de communiquer en ANSI depuis un projet PHP en UTF8 faute de pouvoir changer la configuration et d'avoir pu trouver des alternatives.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    306
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 306
    Points : 194
    Points
    194
    Par défaut
    Si je comprends bien ta réponse, finalement tu n'a pas pu écrire de l'unicode dnas la base sql server?

  9. #9
    Membre confirmé
    Avatar de FMaz
    Inscrit en
    Mars 2005
    Messages
    643
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 643
    Points : 640
    Points
    640
    Par défaut
    Pas via PDO.

    Pour une raison obscure (et difficile à accepter), il n'existe aucun connecteur PDO efficace à MS SQL:

    The PDO_MSSQL extension is currently not shipped with Zend Server on windows due to known instability issues and due to the fact that the underlying libraries are no longer maintained for Windows (see http://php.net/manual/en/ref.pdo-dblib.php). If you wish to, you can take the extensions' DLL from the non-thread-safe PHP package from php.net:
    Src.: http://forums.zend.com/viewtopic.php?f=8&t=1153#p4399


    Personnellement ca fait 3 jours que j'essaie de me connecter, et j'ai finalement réussit à trouver une version compatible de php_pdo_mssql.dll, et dès que je tente d'afficher une page qui requiert de charger des données UTF-8 du serveur, j'ai droit à:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Fatal error: Uncaught exception 'PDOException' with message
    'SQLSTATE[HY000]: General error: 10007 Unicode data in a Unicode-only
    collation or ntext data cannot be sent to clients using DB-Library (such
    as ISQL) or ODBC version 3.7 or earlier. [10007] (severity 5) [(null)]'
    Dans mon cas, je pourrais me permettre d'utiliser un encodage Latin-1, sauf que l'outil de migration fourni par Microsoft oblige à convertir les champs en nvarchar... (au lieu de varchar, n = unicode)

    Il y a aussi les connexion ODBC qui semble donner de bon résultats,mais c'est zéro documenté, et je ne suis pas encore parvenu à trouver une connexion string valide, mais c'est peut-être une piste que tu devrais suivre.

  10. #10
    Rédacteur

    Avatar de arnolem
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 856
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 856
    Points : 6 114
    Points
    6 114
    Par défaut
    Pour information :

    Certaines applications (notamment celles qui sont basé sur le Web) doivent utiliser les données Unicode qui sont codées avec la méthode de codage UTF-8. SQL Server 7.0 et SQL Server 2000 utilisent un autre Unicode codage (UCS-2) et ne reconnaissent pas UTF-8 comme données de caractère valide.
    http://support.microsoft.com/kb/232580/fr

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    72
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 72
    Points : 84
    Points
    84
    Par défaut
    Citation Envoyé par arnolem Voir le message
    SQL Server propose pour la gestion des charsets multi-octets, UCS-2LE, on peut mettre des données multi-octets en définissant ses colonnes à n-varchar

    Je me suis déjà arraché les cheveux sur le sujet, voici le fruit de mes travaux :

    http://tony.fouchard.free.fr/2010/05...ver-using-php/

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    72
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 72
    Points : 84
    Points
    84
    Par défaut
    Citation Envoyé par FMaz Voir le message
    Pas via PDO.

    Pour une raison obscure (et difficile à accepter), il n'existe aucun connecteur PDO efficace à MS SQL:


    Src.: http://forums.zend.com/viewtopic.php?f=8&t=1153#p4399


    Personnellement ca fait 3 jours que j'essaie de me connecter, et j'ai finalement réussit à trouver une version compatible de php_pdo_mssql.dll, et dès que je tente d'afficher une page qui requiert de charger des données UTF-8 du serveur, j'ai droit à:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Fatal error: Uncaught exception 'PDOException' with message
    'SQLSTATE[HY000]: General error: 10007 Unicode data in a Unicode-only
    collation or ntext data cannot be sent to clients using DB-Library (such
    as ISQL) or ODBC version 3.7 or earlier. [10007] (severity 5) [(null)]'
    Dans mon cas, je pourrais me permettre d'utiliser un encodage Latin-1, sauf que l'outil de migration fourni par Microsoft oblige à convertir les champs en nvarchar... (au lieu de varchar, n = unicode)

    Il y a aussi les connexion ODBC qui semble donner de bon résultats,mais c'est zéro documenté, et je ne suis pas encore parvenu à trouver une connexion string valide, mais c'est peut-être une piste que tu devrais suivre.
    On trouve sur le lien fournit précédemment un exemple de dsn odbc, pas de documentation fournit par php car odbc c'est l'oeuvre de MS, y a un assitant dans le panneau de configuration windows pour générer des DSN

  13. #13
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Pour une raison obscure (et difficile à accepter), il n'existe aucun connecteur PDO efficace à MS SQL:
    J'ai une application qui tourne depuis plus d'un an avec PDO et SQL server 2005.
    La seule manipulation mais qui est valable quelque soit l'extension est de remplacer ntwlib.dll
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

Discussions similaires

  1. [SAX] Lire des données imbriquées dans d'autres
    Par totot dans le forum Format d'échange (XML, JSON...)
    Réponses: 16
    Dernier message: 03/05/2014, 18h48
  2. Ecrire et lire des données en C
    Par Laura675 dans le forum Débuter
    Réponses: 11
    Dernier message: 02/01/2013, 17h37
  3. lire des données hexa dans un fichier
    Par neurodoxx dans le forum C++
    Réponses: 1
    Dernier message: 11/02/2011, 15h43
  4. Ecrire et lire des données d'une classe
    Par rtg57 dans le forum Entrée/Sortie
    Réponses: 7
    Dernier message: 03/04/2010, 19h11
  5. Lire des données saisies dans des TEdit
    Par hayat2 dans le forum Composants VCL
    Réponses: 5
    Dernier message: 10/05/2009, 07h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo