我在通过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'
也许东西是错误的,我的编码,或与我的语法的方式。 有人建议一个存储过程,但我希望不要走这条路。
这似乎是一个非常类似的问题,有没有真正的答复。
下面的代码样本都经过测试和验证使用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代替。 需要一些帮助来连接 ,然后使用该文档的配方用于执行语句:
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