2016-12-03 2 views
0

J'ai une table appelée 'segments' stockée dans une base de données MySQL. La table est encodée UTF-8 (charset utf8, collation utf8_general_ci), et la colonne 'label' contient des chaînes avec accents, comme "Fidèles", "Arrêtés", etc.Chaîne avec des accents dans la table MySQL retournée comme NA dans R (RODBC)

Je interroge cette table en utilisant R, et la package rodbc, avec un simple:

data = sqlQuery(channel = myodbcconnection, query = "SELECT label FROM segments") 

Cela se traduira par toutes les chaînes contenant des accents étant remplacées par des valeurs NA. Ce n'est pas seulement les accents qui sont remplacés par les caractères de remplissage. La chaîne entière devient NA.

  • Exécution de la requête de MySQL Workbench renvoie les chaînes correctes, donc la table est bien
  • fichiers R sont utf-8 codé, d'origine avec encodage UTF-8, etc.
  • La connexion ODBC utilise un MySQL ODBC UNICODE pilote

ce qui est encore weirded est que si je lance une mise à jour de la base de données R, avec quelque chose comme:

sqlQuery(channel = myodbcconnection, query = "UPDATE segments SET label = 'Testé et approuvé' WHERE id = 70") 

La base de données est mise à jour correctement. Mais si je le sélectionne, il renvoie une valeur NA.

Cela me rend fou. ;-) Toute aide serait grandement appréciée.

+0

J'ai essayé toutes les combinaisons de 'as.is' et' stringAsFactors' (juste au cas où), en vain. –

+0

Je dois aussi ajouter que lorsque je crée ma connexion ODBC avec 'odbcConnect', je spécifie' DBMSencoding = "UTF-8" ' –

Répondre

1

Après beaucoup de douleur, j'ai trouvé une réponse partielle à ma propre question.

Le problème était, comme prévu, avec la connexion ODBC et la façon dont elle codait les communications utf8. Dans la chaîne de connexion ODBC, vous devez spécifier CharSet = utf8. Par exemple:

Pilote = {pilote MySQL ODBC 3.51}; Serveur = localhost; Base de données = myDataBase; Utilisateur = monUtilisateur; MotDePasse = monMotDePasse; Option = 3; CharSet = utf8;

Notez que:

  • Il ne suffit pas de sélectionner le pilote Unicode (UTF8 compatible) ODBC.
  • La spécification de "DBMSencoding" comme utf8 dans la fonction odbcConnect n'était pas suffisante non plus.
  • Cela a corrigé le problème sur mon hôte local, mais pas dans mon environnement de production (Ubuntu/AWS), pour une raison inconnue.