# [mysql] les accents posent problème !

## chrissou

Bonjour @ tous j'ai un problème avec ma base mysql.

Je viens de migrer un serveur de chez amen vers une dedibox sous gentoo,

et la base mysql de la gentoo ne semble pas aimé les accents ;'(

J'ai regardé les  posts a ce sujet qui propose de  recompilé le mysql avec le  USE="latin1" ce que j'ai fait mais ca ne change rien :'(

quand je fais un select * from matable je ne vois pas les accents qu'il devrait y avoir,

 et le message se  retrouve tronqué au niveau de l'accent ..

Merci d'avance

----------

## SnowBear

Salut,

une autre solution consiste à downgrader mysql à une version 4.*.

----------

## netfab

Salut,

Ta page utilise quel encodage ? Quelle application php utilises-tu ?

Je ne sais pas s'il est possible de convertir une base entière d'un encodage à un autre (certainement que oui, mais je ne sais pas comment).

Répond à ces questions. Tu as phpmyadmin ? si oui, regarde quel encodage est utilisé pour la base de donnée concernée.

----------

## chrissou

Alors pour le downgrade de mysql je suis déjà en version 4.1.20

Concernant PHP c'est un site fait maison par contre les pages php avec accents ne posent pas problème j'ai bien les accents affichés.

Le problème n'apparait que lorsque la page fait appel a la BDD ou  la les accents n'apparaissent pas  ...

je n'ai pas phpmydamin par contre j'ai  fait ceci :

```

mysql> status;

--------------

mysql  Ver 14.7 Distrib 4.1.20, for pc-linux-gnu (i686) using readline 5.1

Connection id:          52

Current database:

Current user:           root@localhost

SSL:                    Not in use

Current pager:          /usr/bin/less

Using outfile:          ''

Using delimiter:        ;

Server version:         4.1.20-log

Protocol version:       10

Connection:             Localhost via UNIX socket

Server characterset:    latin1

Db     characterset:    latin1

Client characterset:    latin1

Conn.  characterset:    latin1

UNIX socket:            /var/run/mysqld/mysqld.sock

Uptime:                 27 min 21 sec

Threads: 1  Questions: 21631  Slow queries: 0  Opens: 30  Flush tables: 1  Open tables: 24  Queries per second avg: 13.182

--------------

```

Je suis donc bien en latin1 apparament

concernant la convertion de la BDD la je ne sais pas du tout .....

----------

## netfab

 *Quote:*   

> Concernant PHP c'est un site fait maison

 

Fais voir la partie du code où tu te connectes à la base mysql.

Edit : Juste après la connexion à la base, essaye d'envoyer la requête suivante :

```

SET NAMES 'latin1'

```

Last edited by netfab on Tue Aug 01, 2006 9:23 am; edited 1 time in total

----------

## chrissou

alors ca par contre je ne pourrais pas te dire c'est une vraie usine a gaz !!

tout ce que je peux dire  c'est que le site tournait a la perfection sur le serveur de chez amen ...

----------

## chrissou

Un petit up  :Wink: 

----------

## chrissou

Alors y a du  mieux ...

J'ai deleter ma database et je l'ai recréer, car c'est a l'injection que mes accents n'ont pas été pris en  compte .

Maintenant quand je regarde dans la bdd j'ai bien les accents présents.

Par contre l'affichage des pages n'est toujours pas correct je vois maintenant tout le texte ce qui est mieux par contre les accents sont remplacés par des caractères bizard genre ici :

```

e cherche aussi des partenaires pour ballade Ã  vÃ©lo mais rassurez vous .... pas pour des compÃ©ts je n'ai qu'un vtc ;- )
```

Merci d'avance

----------

## geekounet

La base d'origine n'était pas en UTF8 des fois ?

----------

## chrissou

aucune idée par contre quand j'édite mon dump de base je vois bien les accents qui apparaissent proprement de même si je me connecte a la  bdd et que je  regarde dans les tables les accents sont affichés correctement ...

----------

## geekounet

 *chrissou wrote:*   

> aucune idée par contre quand j'édite mon dump de base je vois bien les accents qui apparaissent proprement de même si je me connecte a la  bdd et que je  regarde dans les tables les accents sont affichés correctement ...

 

Et la console que tu utilise est en UTF8 ou non ?

----------

## chrissou

je ne pense pas :

```

# /etc/conf.d/consolefont

CONSOLEFONT="lat9w-16"

CONSOLETRANSLATION="8859-15_to_uni"

```

si tu veux voir un apercu de mon site : http://www.mieuxadeux.com/membre.php?id=1130&col=2&t=1&c47=1&Ap=6

----------

## geekounet

Nan en fait plutôt que de voir avec l'endodage de la console, quand tu édite ton dump, l'éditeur indique quel encodage ? (:set fileencoding avec vi)

----------

## chrissou

alors j'ai tenté de faire un :set fileencoding sous vi mais ca me dit rien du tout a part

```

fileencondig=

```

----------

## geekounet

Sinon essaie un file ton_dump.sql

----------

## chrissou

pas grand chose de mieux voici le résultat :

```

a2 ~ # file ma2.dump

ma2.dump: Non-ISO extended-ASCII text, with very long lines, with LF, NEL line terminators

```

----------

## cooldje

Salut,

Je rencontre le même soucis entre deux serveurs.

Un serveur apache 2.0.55 + mysql 4.1.14 (latin1) + php 5.0.4

Affichage ok >> firefox m'indique un coding en iso-8859-1

export de la base vers ce serveur : 

Un serveur apache 2.2.2 + mysql 4.1.19 (latin1 reconfiguré, celui-ci était par défaut en utf- :Cool:  + php 5.1.4

Affichage ok via le shell mysql.

n'affiche pas correctement les accents via apache/php

>> firefox m'indique iso-8859-1, si je le force en UTF-8, affichage ok

>> si je force dans apache avec la directive "AddDefaultCharset UTF-8" sur le vhost concerné, affichage ok.

J'ai comparé les config apache / mysql et php au niveau encoding , tout corespond, je ne comprends pas pourquoi cette différence.

Sur les deux serveur Mysql :

```

mysql> show variables like 'character_set%';

+--------------------------+----------------------------+

| Variable_name            | Value                      |

+--------------------------+----------------------------+

| character_set_client     | latin1                     |

| character_set_connection | latin1                     |

| character_set_database   | latin1                     |

| character_set_results    | latin1                     |

| character_set_server     | latin1                     |

| character_set_system     | utf8                       |

| character_sets_dir       | /usr/share/mysql/charsets/ |

+--------------------------+----------------------------+

7 rows in set (0.00 sec)

```

la variable character_set_system est obligatoirement utf-8.

phpmyadmin est trompeur, il gère les encoding tout seul, du coup, les soucis n'apparaisent pas clairement.

Je continue de chercher, je poste car peut être certaines informations peuvent aider, ensemble on devrait bien y arriver !

ps : les deux mysql sont compilés avec la variable use "-latin1", pourtant le 4.1.14 semble être par défaut en latin1 depuis le début, en revanche, j'ai dû reparamétré le 4.1.19.

----------

## netfab

Si votre base de données a été créée avec un jeu de caractère utf8, que votre serveur est configuré pour avoir un jeu de caractères ISO par défaut, il faut forcer le jeu de caractères après la connexion à la base de données.

----------

## chrissou

j'ai exactement les mêmes soucis que cooldje ...

a savoir :

```

mysql> show variables like 'character_set%'; 

+--------------------------+----------------------------+ 

| Variable_name            | Value                      | 

+--------------------------+----------------------------+ 

| character_set_client     | latin1                     | 

| character_set_connection | latin1                     | 

| character_set_database   | latin1                     | 

| character_set_results    | latin1                     | 

| character_set_server     | latin1                     | 

| character_set_system     | utf8                       | 

| character_sets_dir       | /usr/share/mysql/charsets/ | 

+--------------------------+----------------------------+ 

7 rows in set (0.00 sec)

```

ca OK

si  je  force le vhost en utf8 la j'ai affichage correct a tous ce qui est appel a la BDD par contre  mon affichage php n'est plus bon ..

j'ai  moi  aussi compiler mysql avec latin1

du coup je ne sais plus que faire ...

Sinon NetFab j'ai suivi ton  lien mais j'ai  pas compris grand chose la dedans alors je me suis pas lancé a faire des commandes en aveugles

----------

## chrissou

au faite  je  pense a ca vu que le site apparament tourne avec latin1 et la BDD avec utf8

n'y aurait pas moyen de forcer apache a n'utiliser utf8 qu'avec la bdd ?

----------

## netfab

 *chrissou wrote:*   

> au faite  je  pense a ca vu que le site apparament tourne avec latin1 et la BDD avec utf8
> 
> n'y aurait pas moyen de forcer apache a n'utiliser utf8 qu'avec la bdd ?

 

C'est ce que je dis : forcer le jeu de caractères juste après la connexion mysql (mais c'est avec php qu'il faut le faire).

Connectez-vous à phpmyadmin. Sur la première page, cliquez sur Base de données.

Sur la page d'après, qu'y a t'il dans la colonne Interclassement en face de votre base ?

Si ensuite, vous cliquez sur votre base, les tables qui la composent ont t'elles le même interclassement ?

Que donne (edit : la réponse est au dessus : latin1) :

```

$ grep default-character /etc/mysql/my.cnf

```

----------

## cooldje

En ce qui me concerne : 

phpmyadmin m'indique latin1_swedish_ci pour la base ainsi que les tables.

et :

```

grep default-character /etc/mysql/my.cnf

default-character-set=latin1

default-character-set=latin1

default-character-set=latin1

default-character-set=latin1

default-character-set=latin1

default-character-set=latin1

default-character-set=latin1

```

Ce sont des choses que j'ai soit vérifié ou paramétré.

Pourquoi pas changer le coding via php après la connexion à la base, mais pourquoi cela serai nécessaire sur un serveur et pas l'autre alors que la configuration semble identique de ce coté là ?

Je m'interroge sur le serveur apache entre la 2.0 et la 2.2 qui n'utiliserai alors pas le même coding par défaut (en dehors de la conf car j'ai déjà vérifié cela).

----------

## chrissou

pour ma part je n'arrive pas a installer phpmyadmin ca  me dit toujours :

```

MySQL a répondu: 

#1045 - Accès refusé pour l'utilisateur: 'root'@'@localhost' (mot de passe: NON)

```

alors que j'ai bien config le config.inc.php enfin c'est pas bien grave je me sers jamais de ce truc la de toute facon ...

----------

## cooldje

Je viens de tester en ajoutant la requête SET NAMES 'latin1'; avant toutes autres requêtes SQL dans le code php, et cela fonctionne bien en effet.

C'est une solution en attendant, mais je suis curieux  :Very Happy:  et j'aimerai bien comprendre pourquoi  :Very Happy: 

----------

## cooldje

chrissou, il faut juste que tu configure le fichier config.default.php dans le rep librairies de phpmyadmin.

----------

## chrissou

impec phpmyadmin fonctionne  :Wink: 

voici ce que ca donne 

```

Jeu de caractères pour MySQL: UTF-8 Unicode (utf8) 

et l'interclassement de toute mes bases : latin1_swedish_ci

```

----------

## netfab

 *chrissou wrote:*   

> pour ma part je n'arrive pas a installer phpmyadmin ca  me dit toujours :
> 
> ```
> 
> MySQL a répondu: 
> ...

 

Pour te connecter à mysql, la commande est la suivante :

```

$ mysql -u root -p

```

 *Quote:*   

> C'est une solution en attendant, mais je suis curieux  et j'aimerai bien comprendre pourquoi 

 

Voilà la réponse (tu remplaces latin2 par utf8 dans l'exemple, et on tombe dans ta situation) :

 *Quote:*   

> EXEMPLE : supposez que column1 est défini par CHAR(5) CHARACTER SET latin2. Si vous n'indiquez pas SET CHARACTER SET, alors la commande SELECT column1 FROM t retournera les valeurs de la colonne column1 en utilisant le jeu de caractères latin2. Si, d'un autre coté, vous utilisez la commande SET CHARACTER SET latin1, le serveur va alors convertir le résultat de latin2 en latin1 juste avant de l'envoyer. De telles conversion sont lentes.

 

http://dev.mysql.com/doc/refman/5.0/fr/charset-connection.html

@chrissou > force le jeu de caractères en effectuant la requête set NAMES 'latin1' après la connexion mysql dans ton script php.

----------

## cooldje

Merci NetFab pour ta réponse

J'avoue que j'ai beau faire des tests, la seule solution semble être de définir le SET NAMES avant les requêtes via PHP.

Car si je comprends bien les variables, je ne devrai pas avoir à lui repréciser le character_set vu que la base est en latin1, les connexions aussi, ainsi que le format des résultats renvoyé (results) latin1.

Définir le SET NAMES, c'est comme ci je lui répétais que oui oui, je voudrai du latin1 stp lol

----------

## chrissou

le problème dans mes scripts php c'est que je  ne capte rien du tout la dedans ce sont des scripts fait  maison  mais pas de moi  et c'est une  véritable usine @ gaz ..

Moi  ce qui m'échappe c'est pourquoi mon site tournait a merveille sur un autre serveur et la  je suis obligé de changer les  scripts :'(

Merci  @ vous

----------

## netfab

Parce qu'il y a de grandes chances que l'encodage par défaut du serveur MySQL ne soit pas le même entre les 2 serveurs.

Que donne :

```

$ grep -R mysql_connect repertoire_des_sources_php/*

```

çà devrait te donner le nom d'un fichier. Ce fichier, upload le quelque part, et donne un lien...

 *Quote:*   

> Car si je comprends bien les variables, je ne devrai pas avoir à lui repréciser le character_set vu que la base est en latin1, les connexions aussi, ainsi que le format des résultats renvoyé (results) latin1.
> 
> Définir le SET NAMES, c'est comme ci je lui répétais que oui oui, je voudrai du latin1 stp lol

 

Oui. Mais sans avoir la base et le code php sous les yeux, je ne peux pas t'en dire plus. L'explication est certainement dans le manuel de mysql, je n'ai pas vérifié.

----------

## chrissou

Effectivement ca me ressort tous les  fichiers ou j'ai un mysql _connect dedans mais il  y a bien 15 fichiers différents :'(

----------

## netfab

 *Quote:*   

> Effectivement ca me ressort tous les fichiers ou j'ai un mysql _connect dedans mais il y a bien 15 fichiers différents :'(

 

Effectivement, une vraie usine à gaz  :Confused: 

----------

## cooldje

En effet, si la connection est fait en début de chaque fichier, va falloir modifier chaque fichier.

Voici comment j'ai fait (fichier de test): 

 *Quote:*   

> 
> 
> $dbconnect = @mysql_connect(localhost, user, password)
> 
> or die("Impossible de se connecter");
> ...

 

le gras, c'est la valeur a renseigner

en rouge la requête pour le latin1 rajouter pour que ça marche

en vert la requête normal qui n'apparaissait pas comme il faut avant.

Ensuite j'ai porter ça dans notre appli mais la connection à la base était centraliser, c'est à dire un seul fichier pour ça à modifier, fichier qui est inclus par la suite dans chaque fichier php qui en à besoin.

----------

## chrissou

ok  bah si c'est la seule solution je vais mettre les mains dans le camboui alors :'(

----------

## cooldje

Ben ouais pour le moment en tout cas je vois pas d'autre solution, je continue de travailler sur le sujet.

Car j'ai d'autre machine pour tester.

Et par exemple, je viens de tester sur un apache 2.0.xx + mysql 4.1.20 (latin1), et ça fonctionne nikel sans ajouter la requête SET NAMES, donc je me demande si mon soucis ne vient pas de apache 2.2.x qui aurait un coding différent par défaut, pour le moment, je n'ai pas trouvé d'infos là dessus.

A suivre lol

----------

## chrissou

et bien j'attends tes tests n'ayant pas d 'autre machine pour tester je suis dans l'attente ...

Merci  @ toi  :Wink: 

----------

