2010-05-24 17 views
0

J'utilise Python pour lire et écrire des jeux de données SAS, en utilisant pyodbc et les pilotes SAS ODBC. Je peux charger les données parfaitement bien, mais quand je sauvegarde les données, en utilisant quelque chose comme:Comment encoder des chaînes Unicode en utilisant pyodbc pour les sauvegarder dans un ensemble de données SAS?

cursor.execute('insert into dataset.test VALUES (?)', u'testing') 

... J'obtiens une erreur pyodbc.Error: ('HY004', '[HY004] [Microsoft][ODBC Driver Manager] SQL data type out of range (0) (SQLBindParameter)').

Le problème semble être le fait que je passe une chaîne unicode; que dois-je faire pour gérer cela?

Répondre

1

Savez-vous quel encodage de caractères attend votre base de données? Si c'est le cas, vous pouvez essayer d'encoder votre chaîne Unicode avant d'exécuter la requête. Donc, si votre base de données attend UTF-8 cordes, vous pouvez essayer quelque chose comme:

encoding = 'utf-8' # or latin1 or cp1252 or something 
s = u'testing'.encode(encoding) 
cursor.execute('insert into dataset.test VALUES (?)', s) 
+0

L'encodage n'est pas mentionné dans la documentation pyodbc ou la documentation SAS ODBC. Donc, en un mot, non. Je pourrais juste tester un tas d'encodages, mais je ne sais pas comment m'assurer que j'utilise l'encodage correct si le système fonctionne sur une machine différente. –

0

Vous dites: « Je peux charger les données parfaitement bien » ... cela signifie que vous pouvez charger des données contenant des caractères ne sont pas dans l'encodage natif utilisé sur votre plate-forme (probablement cp1252 sur Windows, mais s'il vous plaît confirmer)? Quel est le type de données SAS de la première colonne de votre ensemble de données SAS?

This article in the SAS docs prétend montrer comment vous pouvez trouver le codage utilisé dans un ensemble de données SAS.

Le codage est mentionné dans le SAS ODBC documentation. Cependant, vous ne semblez pas utiliser SAS ODBC (c'est-à-dire le script en langage SAS accédant à des données non-SAS).

+0

Quand je dis que je peux parfaitement charger les données, je veux dire qu'elles se présentent comme une chaîne unicode, pas comme des octets. Et j'utilise les pilotes SAS ODBC externes, n'appelant pas SQL à partir d'un script SAS. –

+1

Re votre commentaire: 1ère phrase: veuillez répondre à ces questions explicitement (0) voulez-vous dire comme un objet Python unicode, pas comme un objet str (1) pouvez-vous charger des données contenant des caractères Unicode qui ne sont pas dans l'encodage natif utilisé sur votre plateforme (2) quelle est votre plateforme (3) quel est le codage natif sur votre plateforme (4) Quel est le type de données SAS de la première colonne de votre jeu de données SAS? ... 2ème phrase: ouais, c'est ce que j'ai deviné, n'est-ce pas? Essayez d'identifier l'encodage utilisé dans votre jeu de données SAS. Modifiez votre question pour ajouter de nouvelles informations, ne le faites pas dans un commentaire. –