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 :
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 :
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
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 :
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,...)
Partager