无法使用pymssql发送Unicode到SQL Server(Unable to send Uni

2019-08-31 07:12发布

我在通过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'

也许东西是错误的,我的编码,或与我的语法的方式。 有人建议一个存储过程,但我希望不要走这条路。

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

Answer 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]


Answer 2:

结束了使用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()


Answer 3:

然与pymssql同样的问题,并没有想切换到pypyodbc

对于我来说,是消除任何口音看到我只需要名字作为参考任何问题。 因此这种方法可能不适合每一个人。

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


Answer 4:

下面是一些东西,为我工作:

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



文章来源: Unable to send Unicode to SQL Server using pymssql