2015-08-05 1 views
1

J'utilise freetds (v0.95.19)/unixODBC (2.3.1)/pyodbc (3.0.7) pour accéder à MS SQL Server 2012 depuis Ubuntu 12.04. Je veux récupérer la valeur d'un varchar (pas nvarchar), qui contient des caractères non-ASCII.La requête pyodbc renvoie différentes valeurs varchar lors de l'utilisation de tds version 7.1 versus 4.2

Si mon fichier odbc.ini est comme

[mydb] 
Driver = FreeTDS 
Description = mydb description 
Trace = No 
Server = mydb.xxxxx.xxx 
Database = XXX 
Port = 1433 
Charset = UTF-8 
TDS_Version = 4.2 

Ensuite, la valeur récupérée est '\ x841 \ x84 \ xc1 \ xcd \ XC5; \ X9b * \ XF5 \ XB5 \ xc1} | \ xcbX' , qui est la valeur attendue.

Cependant, si je change simplement TDS_Version en 7.1, la valeur récupérée devient '? 1? \ Xc1 \ xcd \ xc5;? * \ Xf5 \ xb5 \ xc1} | \ xcb', qui remplace les caractères '\ x84' et '\ x9b' avec '?' et il manque le 'X' à la fin de la chaîne.

J'ai essayé tout ce que je pouvais penser (y compris la mise à jour de freetds, unixODBC, et pyodbc vers les dernières versions stables) mais rien ne semble jusqu'ici aider. L'utilisation de TDS version 4.2 a d'autres problèmes, alors j'espère vraiment faire fonctionner la version 7.1, mais je n'arrive pas à comprendre pourquoi les valeurs varchar récupérées ne sont pas correctes. BTW, mon fichier freetds.conf a le contenu suivant (si la version tds est 7.1 ou pas dans ce fichier ne semble pas affecter les résultats que je reçois avec pyodbc).

[global] 
tds version=4.2 

[mydb] 
host = mydb.xxxxx.xxx 
tds version = 7.1 
port = 1433 
client charset = UTF-8 

en python (2.7.3) je

import pyodbc 
conn=pyodbc.connect('DSN=mydb;DATABASE=XXX;UID=XXX;PWD=XXX') 
cursor=conn.cursor() 
cursor.execute("select myVarcharColumn from my.table where id=XXX").fetchone() 

Répondre

0

Remplacement Charset = UTF-8 avec ClientCharset = WINDOWS-1252 dans odbc.ini (puis exécutez odbcinst -i -s -f /usr/local/etc/odbc.ini) fait fonctionner les choses pour la version TDS 7.1 pour moi.

Apparemment, avoir Charset = UTF-8 dans le fichier odbc.ini ne fonctionne pas pour définir le codage sur UTF-8 (voir http://www.freetds.org/userguide/odbcconnattr.htm pour plus d'informations). En fait, le codage par défaut de ISO_8859-1 a été utilisé avec mes paramètres précédents. Cela fonctionne pour la version 4.2 de TDS, mais pas pour la version 7.1, vraisemblablement en raison du transfert différentiel des données par TDS depuis la version 7.0 (UCS-2).