【问题标题】:Unable to send Unicode to SQL Server using pymssql无法使用 pymssql 将 Unicode 发送到 SQL Server
【发布时间】:2013-04-08 02:10:17
【问题描述】:

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

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

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

【问题讨论】:

    标签: windows unicode python-2.7 pymssql


    【解决方案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]
    

    【讨论】:

      【解决方案2】:

      这对我有用:

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

      【讨论】:

      • 所以你基本上销毁了所有不适合 latin-1 的字符。不完全是这个问题的想法
      【解决方案3】:

      在使用 pymssql 时遇到了同样的问题,不想切换到 pypyodbc

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

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

      【讨论】:

      • 我几乎写完了自己的问题,但就在发布之前,我尝试了您的解决方案。事实上,我只使用了“unicodedata.normalize('NFKD', somestring.decode())”,一切正常。先生,你太棒了!
      【解决方案4】:

      最终改用 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()
      

      【讨论】:

      • 隐含在上面提到的good connection advice 中是一个我没有尝试过的想法:从pypyodbc 中获取unicode 示例(如果必须的话)并尝试pyodbc(如果没有的话)。
      猜你喜欢
      • 2011-05-08
      • 2013-05-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-02
      • 2018-06-04
      • 1970-01-01
      相关资源
      最近更新 更多