2009-10-08 6 views
0

Il semble que nous avons réussi à insérer dans notre base de données 2 caractères unicode pour chacun des caractères unicode que nous voulons,fixation Unicode Oops

Par exemple, pour le unicde omble 0x3CBC, nous avons inséré les équivalents unicode pour chacun de ses composants (0xC383 et 0xC2BC)

Quelqu'un peut-il penser à une solution simple pour résoudre ce problème?

Je suis venu avec quelque chose comme

SELECT replace(name, CONCAT(0xC3,0x83,0xc2,0xbc), CONCAT(0xc3,0xbc)) FROM lang

Pour ce qui précède, mais ne veulent pas avoir à faire cela pour tous les caractères unicode!

+0

Tout d'abord, êtes-vous sûr que c'est le problème réel? Il peut également y avoir un problème dans l'affichage des caractères (alors qu'ils sont correctement codés dans la base). S'il y a vraiment un problème dans la base, alors je ne vois pas d'autre solution qui dépasse chaque octet de chaque ligne de la base; mais cela peut être fait de manière algorithmique plutôt facilement. –

+0

Oui, je suis sûr, j'ai fait des décharges hexadécimales et toutes les données :( – Mez

+0

avez-vous compris comment cela s'est passé? Je pense que si vous maintenant comment c'est arrivé, alors nous pouvons comprendre comment inverser le processus. – longneck

Répondre

3

pour le unicde omble 0x3CBC

Je suppose que vous voulez dire l'Unicode ombles U + 00FC LATINE LETTRE U TRÉMA (ü), qui est codée en UTF-8 \ xc3 \ XBC .

Je ne pense pas que vous pouvez faire le changement dans MySQL. Vous pouvez faire:

-- convert doubly-encoded UTF-8 to singly-encoded 
ALTER TABLE table MODIFY column TEXT CHARACTER SET latin1; 
-- deliberately lose encoding information 
ALTER TABLE table MODIFY column BLOB; 
-- interpret the single-encoded UTF-8 bytes as UTF-8 
ALTER TABLE table MODIFY column TEXT CHARACTER SET utf8; 

pour chaque colonne dans le schéma. Cela fonctionne pour l'exemple spécifique que vous donnez, mais échoue lorsque l'un des octets de chemin UTF-8 est dans la plage 0x80-0x9F. C'est parce que le codage «latin» de MySQL n'est pas vraiment ISO-8859-1, mais en fait Windows cp1252, qui mappe différemment les caractères de la gamme.

Probablement le moyen le plus simple serait de vider le lot et de faire la conversion sur le fichier mysqldump. par exemple. à partir de Python:

# Remove one level of UTF-8 encoding 
# 
dump= open('/path/to/dump.sql', 'rb').read() 
dump= dump.decode('utf-8').encode('iso-8859-1') 
open('/path/to/dump-out.sql', 'wb').write(dump) 
+0

+1 pour la solution python Le .encode ('iso-8859-1') est un hack sympa pour extraire les octets bruts de l'objet Unicode. –