2010-12-12 48 views

Répondre

2

Dans quel type de colonne sauvegardez-vous vos données? Si la pièce jointe peut être de n'importe quel type, vous avez besoin d'une colonne bytea pour vous assurer que les données sont simplement transmises en tant que blob ("grand" objet binaire). Comme mentionné dans d'autres réponses, cette erreur indique que certaines données envoyées à PostgreSQL et marquées comme étant du texte en codage UTF-8 n'étaient pas valides.

Je vous recommande de stocker les pièces jointes en tant que binaire avec leur en-tête de type de contenu MIME. L'en-tête Content-Type doit inclure le codage de caractères nécessaire pour convertir le contenu binaire en texte pour les pièces jointes lorsque cela a du sens: par ex. "text/plain; jeu de caractères = iso-8859-1".

Si vous souhaitez que le texte décodé soit disponible dans la base de données, vous pouvez demander à l'application de le décoder et de stocker le contenu textuel, avec éventuellement une colonne supplémentaire pour la version décodée. C'est utile si vous voulez utiliser l'indexation de texte intégral de PostgreSQL sur les pièces jointes, par exemple. Cependant, si vous voulez simplement les stocker dans la base de données pour les récupérer plus tard, il suffit de les stocker en tant que binaires et de vous soucier de l'encodage du texte dans l'application.

0

Le 0xa0 est un espace insécable, éventuellement codage latin1. En Python j'utiliserais str.decode() et str.encode() pour le changer de son encodage actuel en encodage cible, ici 'utf8'. Mais je ne sais pas comment ça se passerait dans Rails.

0

Je ne sais pas Rails, mais quand PG donne ce message d'erreur, cela signifie que:

  • la connexion entre postgres et votre client Rails est correctement configuré pour utiliser le codage UTF-8, ce qui signifie que tous les les données de texte en cours entre le client et postgres doit être encoed en utf-8

  • et votre client Rails envoyés par erreur des données codées dans un autre encodage (plus probablement latin-1 ou ISO-8859): postgres donc rejette

Vous devez regarder dans votre code client où les données sont insérées dans la base de données, vous essayez probablement d'insérer une chaîne non-unicode ou il y a un transcodage incorrect qui a lieu.