Bonjour,
à quel moment faut-il insérer :
mysql_query("SET NAMES 'utf8'");
pour que cela soit efficace ?
Merci !
Paul
Bonjour,
à quel moment faut-il insérer :
mysql_query("SET NAMES 'utf8'");
pour que cela soit efficace ?
Merci !
Paul
au début d'une session avec un client UTF8.
Oui, ou juste avant une requête spécifique, tu n'es pas obligé de le faire pour toutes tes requêtes si tu n'en a pas besoin.
C'est valable pour l'ensemble de la session. Donc si je suis ton principe, le scénario serait le suivant :Envoyé par vallica
- j'ouvre ma session
- j'envoie un premier paquet de requêtes avec un mauvais jeu de caractères, mais je considère que ce n'est pas grave pour celles-là
- je fais mon SET NAMES UTF8
- j'envoie ma "requête spécifique"
- je continue le reste de ma session en UTF8
Franchement, je ne vois pas l'intérêt...
Bonjour,
La semaine dernière j'ai eu à faire un script dans lequel je devais importer en UTF-8 des données qui se trouvaient dans des tables hétérogènes niveau encodage.
Je ne suis pas un pro des charset, etc. mais j'avais des tables en latin1 et certaines en utf8_general_ci, et selon les requêtes je devais changer le SET NAMES pour que mon import aboutisse.
C'est dans ce sens là que j'ai posté cette réponse.
C'est là où est ton erreur : le SET NAMES indique avec quel jeu de caractères on envoie les données à MySQL, quel que soit le jeu utilisé dans la colonne cible.
Autrement dit, si j'envoie à MySQL des données UTF8 dans une table latin1, il fait automatiquement la conversion. Par contre, si je lui envoie des données UTF8 en faisant un SET NAMES latin1, je lui fais croire que mes données sont en latin1, donc il ne convertit plus et on se retrouve avec n'importe quoi...
Oui, Merci pour l'explicationEnvoyé par Antoun
Mais dans l'autre sens : pour être sûr de récupérer de l'UTF-8
comment fait-on ?
on indique que le client est en UTF8... ce qui s'exprime
;-)
Code : Sélectionner tout - Visualiser dans une fenêtre à part SET NAMES utf8
Merci pour ta réponse Antoun.
J'aurais une petite dernière question…
La création en UTF-8 de ma base n'a pas été une réussite (comme j'installe un ecommerce j'ai beaucoup de fichiers, d'includes, etc…*j'ai beaucoup trop de fichiers à modifier sans en oublier au passage).
Je vais recommencer en iso-8859-1.
Mais je n'ai pas cette option à la création. A moins que ça soit : latin1_general_ci
C'est ça ?
Et pis tiens tant que j'y suis :
sans parler du contenu, mais juste au niveau de la structure est-ce qu'on peut modifier en latin1_general_ci une base créée en UTF-8 ou il vaut mieux tout recréer ?
Merci pour ta patience !
- iso-8859-1 correspond effectivement à latin1
- tant qu'il n'y a pas de données, tu peux modifier la structure comme tu veux
- quand il y a des données... tant qu'elles sont correctes, on peut tout convertir dans tous les sens ; par contre dès qu'il y a des conneries, c'est assez difficile de s'en sortir parce que les conneries sont converties automatiquement aussi (la solution étant de passer par un BLOB).
Ah j'ai mis du temps à comprendre…Envoyé par Antoun
Par exemple un type Tinyblob ou Longblob ?
Ouh la la je rame à changer à la main les interclassements…
Rien pout automatiser ça ?
SQL par exemple ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 -- modifie et convertit toutes les colonnes d'une table ALTER TABLE truc CONVERT TO utf8 COLLATE utf8_unicode_ci
Bon j'ai dû rater une marcheEnvoyé par Antoun
si je mets : SET NAMES 'utf8'; la page ne se charge pas.
Comment faut-il l'écrire ?
J'ai juste besoin que les différentes query de la page soient passées en UTF-8 à la toute fin, juste avant un export en xml.
En attendant j'ai mis : mysql_query("SET NAMES 'utf8'");
et ça fonctionne. Mais tu me fais peur avec le fait qu'à cause de ça, je puisse écrire en UTF-8 dans la base latin1…
tu es en php c'est donc normal que tu passes le set names via le mysql_query, aucun problème dans ce que tu as fait.
sauf que si j'enregistre quelque chose dans la base après cette ligne, cela sera en UTF-8 alors que la table est en Latin1, c'est ça ?
pas du tout. En gros, soit ton client (tes pages PHP) est déjà en UTF-8, et dans ce cas le SET NAMES corrigera une éventuelle erreur de déclaration, ou plus probablement ne changera rien.Envoyé par Mister Paul
Pour ce qui est des données qui sortent de la base, le problème est un peu différent... mais on va commencer par faire un peu de diagnostic. Peux-tu passer les requêtes suivantes via ton mysql_query ?
PS : au passage, on écrit SET NAMES utf8 sans les apostrophes.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 -- config théorique : SHOW VARIABLES LIKE '%char%'; -- détection de la config réelle : SELECT _utf8'é', _latin1'é', ORD(_utf8'é'), ORD(_latin1'é') ;
Aïe je vais partir une semaine et je n'ai pas le temps là…
Mais ça m'intéresse bien et j'essaierai ces tests à mon retour.
En attendant j'ai fait un :
Et ça marche impec…
Code : Sélectionner tout - Visualiser dans une fenêtre à part $name = utf8_encode ($results[$i]['image']);
en gros, si mes tests te montrent que ton client est en latin1 et déclaré en latin1, la meilleure solution est sans doute celle que tu as adoptée !
Si tu cherches de la lecture pour tes vacances, je ne peux que te conseiller mon article "Jeux de caractères et collations" (lien en signature)
PS : au passage, quand tu écris du code, pense à le mettre entre des balises [CODE][/CODE]
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager