无法使用pymssql将Unicode发送到SQL Server

我有问题通过pymssql发送unicode到SQL Server:

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() 

这两个执行语句在SQL Server端产生相同的乱码文本:

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

也许我编码的方式或者语法有些问题。 有人build议存储过程,但我希望不必走这条路。

这似乎是一个非常类似的问题,没有真正的回应。

Solutions Collecting From Web of "无法使用pymssql将Unicode发送到SQL Server"

以下代码示例已经过测试和验证,可以使用pymssql 2.1.1与Python 2.7.5和Python 3.4.3一起使用。

对于以UTF-8编码保存的Python源文件:

 # -*- 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() 

对于使用“ANSI”(Windows-1252)编码保存的Python源文件:

 # -*- 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() 

请注意,两个样本之间的唯一区别是声明源文件编码的第一行。

要清楚的是,接收INSERT的表是:

 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] 

结束使用pypyodbc代替。 需要一些帮助来连接 ,然后使用doc配方来执行语句:

 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() 

用pymssql进入相同的问题,不想切换到pypyodbc

对我来说,除去任何口音都没有问题,因为我只需要名字作为参考。 所以这个解决方案可能不适合每个人。

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

这是对我有用的东西:

 # -*- 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的排序规则是:Latin1_General_CI_AS,列col1的类型是varchar(MAX)

我的环境是:SQL server 2008和Python 2.7.10