4

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

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

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

也许我的编码方式或语法有问题。有人建议使用存储过程,但我希望不必走那条路。

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

4

4 回答 4

3

最终改用 pypyodbc 。需要一些帮助来连接,然后使用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()
于 2013-04-15T22:03:49.410 回答
2

遇到与 pymssql 相同的问题,不想切换到 pypyodbc

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

import unicodedate
firstName = u'René'
firstName = unicodedata.normalize('NFKD', firstName).encode('ascii', 'ignore')
print firstName 
于 2015-01-30T21:25:56.087 回答
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]
于 2015-11-27T02:54:38.307 回答
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

于 2015-11-25T06:42:50.547 回答