2010-02-24 5 views
1

Je reçois le message d'erreur: « séquence d'octets non valide pour le codage « UTF8 »: 0x9fPostgreSQL: Se connecter requête uniquement en cas d'erreur

Ok, maintenant je sais quelque part mon application php tente d'interroger en utilisant ce caractère 0x9f . mais je ne sais pas où.

J'ai vérifié postgresql.conf mais je ne trouve pas quelque chose comme « log_on_error ». Il est seulement le paramètre log_statement qui provoque postgres à enregistrer toutes les sélections ou seulement toutes les requêtes. mais que Je voudrais voir est-ce:

ERROR: "Invalid byte sequence for encoding "UTF8": 0x9f 
QUERY: SELECT * FROM blabla WHERE field1='blabla0x9f' 

Dans ce cas, je serais en mesure de voir quelle requête a causé cela. Donc, je sais dans quel script php à vérifier.

Est-ce possible avec postgres? Ma version de psql est 8.3.9.

Répondre

2

Vous recherchez log_min_error_statement pour cela. Mais "séquence octet invalide" vient dans l'analyseur avant même que le texte est analysé dans une déclaration. Il n'y a donc aucun moyen de se connecter sans risquer de l'enregistrer dans un encodage bizarre et de le rendre inutile ou dangereux.

Mais peut-être que votre application PHP détecte l'erreur? Sinon, vous ne vérifiez pas assez de codes de retour là;)

+0

Ok, mais comment cela se fait? Toutes mes pages sont en utf-8 (en utilisant charset = utf-8 dans la tête html). Ma base de données est en UTF-8. Alors, comment cela peut-il arriver? Savez-vous quel caractère est cette chose 0x9f? – NovumCoder

+0

Les pages ne sont très clairement pas * traitées * en UTF-8. Probablement votre environnement PHP n'est pas défini pour UTF8. Je ne suis pas un expert PHP, donc je ne sais pas exactement comment régler ça. Peut-être default_charset est ce que vous cherchez à définir dans votre config PHP? –

+0

cette chose '0x9f' est un octet avec la valeur hexadécimale 9f (= 159). Êtes-vous sûr que votre requête ne dit pas '\ 0x9f', cette barre oblique inverse est importante. la cause est probablement quelqu'un à la recherche de vulnérabilités d'injection SQL dans votre site. – Jasen

1

Juste pour être clair, parce que je ne pense pas que Magnus passe (bien que sa réponse soit plutôt bonne): Si vous lisez le fichier en UTF -8, mais il est encodé en latin1 il ne se convertit pas en utf8 par magie. Vous pouvez uniquement travailler avec le fichier dans l'encodage du fichier, que ce soit en le soumettant à la base de données ou en le réencodant dans un encodage différent. Vous avez trois options (que je pourrais utiliser):

Bien sûr, le plus à droite est le premier.

  1. Convertir le fichier en utilisant php. Lisez le docs on recode pour plus d'informations à ce sujet.

  2. Modifier le client_encoding sur postgresql, en utilisant set client_encoding = encoding. Vous pouvez trouver le valid encoding in the docs

  3. Envoyer à postgresql à convertirread the docs on PostgresSQL's convert()

Information about the php function recode `

+0

option 4: '$ f = popen (" iconv -f latin-1 -t utf8 Jasen

Questions connexes