Bonjour,

Je vous explique ma problématique

Je dispose d'une base en UTF8, qui contient une table qui contient un colonne de type Text.

Je dispose d'une deuxième base identique, mais en Latin1, également avec une table contenant une colonne de type Text.

Je souhaiterai migrer les données de la base UTF8 vers la base Latin, et pour cela j'utilise les import export en masse de mysql:

Select :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
 
SELECT
    id, clef, hex(valeur)
FROM 
  TABLE_UTF
INTO OUTFILE 'C:/Amine/DEV/facade_conf.csv'
CHARACTER SET LATIN1
FIELDS TERMINATED BY ';'
LINES TERMINATED BY '\n';
L'Insert :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
 
LOAD DATA INFILE 'C:/Amine/DEV/facade_conf.csv' 
INTO TABLE TABLE_LATIN
CHARACTER SET LATIN1
FIELDS TERMINATED BY ';'
LINES TERMINATED BY '\n'
(id,    clef,    @hex_valeur)
SET    valeur=UNHEX(@hex_valeur);
Sauf que en sortie, je me trouve avec un champ valeur valant :

'1001', 'Test accent', 'Migration/Déménagement'
'1002', 'Test apostrophe', 'Allé Ã* l''école'
'1003', 'Test Oeuf', 'Å’uf'

Les 'é', et 'OE' ne sont pas correctement trancoder.

J'aimerai savoir comment marche le 'CHARACTER SET LATIN1' dans les deux cas et pourquoi le résultat obtenu n'est pas le résultat attendu!??


J'ai trouver 3 solutions pour contourner ce problème, pour qui ça intéresserait, classées, à mon gout par ordre préférentiel :

Solution 1
Dans le Select, remplacer hex(valeur) par
Code : Sélectionner tout - Visualiser dans une fenêtre à part
 hex(convert(valeur using LATIN1)).
hex(convert(valeur using LATIN1)).

Solution 2
Avant de lancer le Load data, on modifie l'encodage de la colonne valeur :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
alter table facade_conf_target modify valeur text CHARSET utf8 COLLATE utf8_unicode_ci;
et puis remettre l'encodage apres le load data

Solution 3
Dès la création de la table en Latin1, déclarer la colonne valeur en UTF8.

J'espère que cela aidera certains parmi vous et je serais reconnaissant d'avoir réponse à ma question

Je reste également ouvert à vos critiques au sujets de mes solutions (perfs, propreté du code,...)