2013-04-15 1 views
3

Je rencontre des problèmes d'envoi unicode à SQL Server via pymssql:Impossible d'envoyer Unicode à SQL Server à l'aide pymssql

In [1]:  import pymssql 
      conn = pymssql.connect(host='hostname', user='me', password='password', database='db') 
      cursor = conn.cursor() 

In [2]:  s = u'Monsieur le Curé of the «Notre-Dame-de-Grâce» neighborhood' 

In [3]:  s 
Out [3]: u'Monsieur le Cur\xe9 of the \xabNotre-Dame-de-Gr\xe2ce\xbb neighborhood' 

In [4]:  cursor.execute("INSERT INTO MyTable VALUES(%s)", s.encode('utf-8')) 
      cursor.execute("INSERT INTO MyTable VALUES(" + s.encode('utf-8') + "')") 
      conn.commit() 

Les deux déclarations exécutent donnent le même texte tronqué sur le côté SQL Server:

'Monsieur le Curé of the «Notre-Dame-de-Grâce» neighborhood' 

Peut-être que quelque chose ne va pas avec la façon dont je suis en train de coder, ou avec ma syntaxe. Quelqu'un a suggéré une procédure stockée, mais j'espère ne pas avoir à suivre cette route.

This semble être un problème très similaire, sans réelle réponse.

Répondre

1

Les exemples de code suivants ont été testés et vérifiés pour fonctionner avec Python 2.7.5 et Python 3.4.3 à l'aide de pymssql 2.1.1.

Pour un fichier source Python enregistré avec encodage UTF-8:

# -*- coding: utf-8 -*- 
import pymssql 

cnxn = pymssql.connect(
    server='localhost', 
    port='52865', 
    user='sa', 
    password='whatever', 
    database='myDb') 
crsr = cnxn.cursor() 
crsr.execute("INSERT INTO MyTable (textcol) VALUES (%s)", (u'Monsieur le Curé of the «Notre-Dame-de-Grâce» neighborhood')) 
cnxn.commit() 
crsr.close() 
cnxn.close() 

Pour un fichier source Python enregistré avec "ANSI" (Windows 1252) encodage:

# -*- coding: windows-1252 -*- 
import pymssql 

cnxn = pymssql.connect(
    server='localhost', 
    port='52865', 
    user='sa', 
    password='whatever', 
    database='myDb') 
crsr = cnxn.cursor() 
crsr.execute("INSERT INTO MyTable (textcol) VALUES (%s)", (u'Monsieur le Curé of the «Notre-Dame-de-Grâce» neighborhood')) 
cnxn.commit() 
crsr.close() 
cnxn.close() 

Notez que la seule la différence entre les deux échantillons est la toute première ligne à déclarer l'encodage du fichier source.

Pour être clair, la table recevant l'insert a été:

CREATE TABLE [dbo].[MyTable](
    [id] [int] IDENTITY(1,1) NOT NULL, 
    [textcol] [nvarchar](255) NULL, 
PRIMARY KEY CLUSTERED 
(
    [id] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 
3

Terminé en utilisant pypyodbc à la place. Nécessaire une aide à connect, puis utilisé le doc recipe pour les instructions d'exécution:

import pypyodbc 
conn = pypyodbc.connect("DRIVER={SQL Server};SERVER=my_server;UID=MyUserName;PWD=MyPassword;DATABASE=MyDB") 
cur = conn.cursor 
cur.execute('''INSERT INTO MyDB(rank,text,author) VALUES(?,?,?)''', (1, u'Monsieur le Curé of the «Notre-Dame-de-Grâce» neighborhood', 'Charles S.')) 
cur.commit() 
+0

Implicite dans le [bon conseil de connexion] (http://stackoverflow.com/a/16025030/1599229) mentionné ci-dessus est une idée que je n'a pas essayé: prenez les exemples unicode de pypyodbc (si vous devez) et essayez pyodbc (si ce n'est pas le cas). – bahmait

2

RAN dans le même problème avec pymssql et ne voulait pas passer à pypyodbc

Pour moi, il n'y avait pas de problème pour éliminer tout accents voyant que j'avais seulement besoin de prénoms comme référence. Donc, cette solution peut ne pas être pour tout le monde.

import unicodedate 
firstName = u'René' 
firstName = unicodedata.normalize('NFKD', firstName).encode('ascii', 'ignore') 
print firstName 
+0

J'avais presque fini d'écrire ma propre question à ce sujet, mais juste avant de publier, j'ai essayé votre solution. En fait, j'ai seulement utilisé "unicodedata.normalize ('NFKD', somestring.decode())" et tout fonctionne. Monsieur, vous êtes génial! – user568021

0

Voici quelque chose qui a fonctionné pour moi:

# -*- coding: utf-8 -*- 
import pymssql 
conn = pymssql.connect(host='hostname', user='me', password='password', database='db') 
cursor = conn.cursor() 

s = u'Monsieur le Curé of the «Notre-Dame-de-Grâce» neighborhood' 

cursor.execute("INSERT INTO MyTable(col1) VALUES(%s)", s.encode('latin-1', "ignore")) 
conn.commit() 
cursor.close() 
conn.close() 

MyTable est de collation: Latin1_General_CI_AS et la colonne col1 en est de type varchar (MAX)

Mon environnement est: SQL Server 2008 & Python 2.7.10

+0

Donc, vous avez essentiellement détruit tous les caractères qui ne rentrent pas dans latin-1. Pas exactement ce que la question avait en tête – EFraim

Questions connexes