2010-05-01 6 views
1

J'utilise ODBC pour me connecter à SQL Server depuis PHP. En PHP, j'ai lu des données chaîne (colonne nvarchar) de SQL Server, puis je voudrais l'insérer dans la base de données mysql. Lorsque je tente d'insérer une telle valeur à la table de base de données MySQL Je reçois cette erreur mysql:Problème d'encodage Php/ODBC

Incorrect string value: '\xB3\xB9ow...' for column 'name' at row 1 

Pour chaîne avec tous les tout caractères ASCII est très bien, le problème se produit lorsque les caractères non-ASCII (de certaines langues européennes) existent. Donc, en termes plus généraux: il y a une chaîne Unicode dans la base de données MS SQL Server, qui est récupérée par PHP via ODBC. Ensuite, il est placé dans une requête d'insertion sql (en tant que valeur pour la colonne varchar utf-8) qui est exécutée pour la base de données mysql. Est-ce que quelqu'un peut m'expliquer ce qui se passe dans cette situation en termes d'encodage? A quelle étape quel caractère codant les conversions peut-il avoir lieu?

-je utiliser: PHP 5.2.5, MySQL5.0.45-community-nt, MS Sql Server 2005.

PHP doivent fonctionner sur la plate-forme Linux .

MISE À JOUR: L'erreur ne se produit pas quand je l'appelle utf8_encode ($ s) sur cette chaîne et d'utiliser cette valeur dans la requête d'insertion mysql, mais la chaîne insérée n'affiche pas correctement dans la base de données MySQL (de sorte que L'encodage utf8 ne fonctionnait que pour forcer la chaîne utf8 correcte, mais il perd les caractères corrects).

+0

Êtes-vous limité à odbc ou pouvez-vous installer/utiliser par ex. les extensions sqlsrv? http://msdn.microsoft.com/en-us/library/cc296152%28SQL.90%29.aspx Cela vous permet de spécifier (facilement) le jeu de caractères de la connexion. – VolkerK

+0

Cette solution devra fonctionner sous Linux et l'extension que vous avez mentionnée n'est malheureusement pas supportée sur cette plateforme. – JohnM2

+0

MySQL! = MSSQL. –

Répondre

1

Peut-être que vous pouvez utiliser le PDO extension, si cela peut faire une différence?

Il ya un utilisateur a contribué commenté here qui suggère de changer les types de données dans le serveur sql à quelque chose d'autre, si cela n'est pas possible, regardez la classe d'utilisateurs qui jette les champs.

1

Je n'ai aucune expérience avec ODBC via PHP, mais avec les fonctions mysql, PHP semble utiliser les connexions ASCII et UTF8 par défaut si vous voulez éviter les problèmes.

Etes-vous sûr que PHP et le serveur MySQL communiquent en UTF8? Jusqu'à PHP 6, le support Unicode a tendance à être ennuyeux comme ça.

Je me souviens que les docs MySQL mentionnent un paramètre de chaîne de connexion pour modifier le codage Unicode. De votre description, il semble que PHP traite la connexion comme étant uniquement ASCII.

4

D'abord, vous avez le codage du DB. Ensuite, vous avez l'encodage utilisé par le client ODBC.

Si le codage de votre connexion client ODBC ne correspond pas à celui de la base de données, la couche ODBC transcodera automatiquement vos données, dans certains cas.

L'astuce ici consiste à forcer le codage de la connexion client ODBC.

Pour un "tout UTF-8" setup:

$conn=odbc_connect(DB_DSN,DB_USR,DB_PWD); 
odbc_exec($conn, "SET NAMES 'UTF8'"); 
odbc_exec($conn, "SET client_encoding='UTF-8'"); 

// processing here 

Cela fonctionne parfaitement avec PostgreSQL + Php 5.x. Le exact La syntaxe et les options dépendent du fournisseur de la base de données.

Vous pouvez trouver très utile et claire des informations supplémentaires pour MySql ici: http://dev.mysql.com/doc/refman/5.0/fr/charset-connection.html

espérons que cette aide.