我在通过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似乎是一个非常相似的问题,没有真正的回应。
答案 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