2010-12-09 20 views
2

J'essaie de déplacer des données d'une base de données à une autre à partir d'une tâche rake.Déplacement de données codées avec Rails

Cependant, je reçois des questions d'encodage fruitées sur certaines des données:

rake aborted! 
PGError: ERROR: invalid byte sequence for encoding "UTF8": 0x92 
HINT: This error can also happen if the byte sequence does not match the encoding expected by the server, which is controlled by "client_encoding". 

Que puis-je faire pour résoudre ce problème et d'obtenir les données? Pour autant que je sache (ne sachant rien du codage), la base de données source est latin1.

+0

0x92 est une bête drôle; http://en.wikipedia.org/wiki/C0_and_C1_control_character suggère que 0x92 est réservé "pour usage interne". Ni http://en.wikipedia.org/wiki/ISO/IEC_8859-1 ni la page de manuel iso-8859-1 de mon système ne donnent d'autre interprétation pour 0x92. Comment 0x92 est-il entré dans la base de données? – sarnold

+0

Les deux bases de données utilisent-elles le même codage? "psql -l" liste les encodages (voir http://www.postgresql.org/docs/8.1/static/multibyte.html). En outre, config.encoding est-il défini sur "utf-8" dans config/application.rb? – seb

Répondre

0

si les deux bases de données sont PG, vous pouvez exporter et importer la base de données tout en utilisant les options de pg_dump pour changer l'encodage ... qu'il

serait probablement le moyen le plus performant pour faire si vous le faites via un râteau tâche, vous pouvez faire le transcoder dans votre râteau tâche ... que cela signifie que vous devrez toucher tous les attributs et ré-encoder ...

comme il semble que votre nouvelle base de données est UTF8 alors que l'ancien est latin1

vous pourriez le faire en ayant toutes les valeurs de type chaîne/texte/texte encodées en utilisant ... vérifier pour répondre à (? g) s'assure que les données ne sont codées que si certaines informations de codage sont jointes, i. e. valeurs numériques transcoder

def transcode(data, toEnc = 'utf8') 
    if data.respond_to?(:encoding) && data.encoding.name != toEnc 
    return data.dup.force_encoding toEnc 
    end 
    data 
end  

vous pouvez simplement lire wont un enregistrement de l'ancien db, exécuter par cette méthode et écrire à la nouvelle base de données

u = OldDBUser.first 
u.attribute_names.each { |x| 
    u[x.to_sym] = transcode u[x.to_sym] 
} 
#... whatever you do with the transcoded u 

... eh bien je pas testé ceux-ci, mais s'il vous plaît faire, peut-être son tout ce dont vous avez besoin