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

时间:2013-04-15 20:19:59

标签: windows unicode python-2.7 pymssql

我在通过pymssql向SQL Server发送unicode时遇到问题:

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

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

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

我的编码方式或语法可能有问题。有人建议存储过程,但我希望不必去那条路。

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

4 个答案:

答案 0 :(得分:3)

使用pypyodbc代替。需要对connect提供一些帮助,然后使用doc recipe执行语句:

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

答案 1 :(得分:2)

与pymssql陷入同样的​​问题并且不想切换到pypyodbc

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

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

答案 2 :(得分:1)

以下代码示例已经过测试和验证,可以使用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]

答案 3 :(得分:0)

这对我有用:

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