2

大家好,我在将 utf-8 unicode 字符插入数据库时​​遇到问题。

我从表单中得到的 unicode 是u'AJDUK MARKO\u010d'. 下一步是将其解码为 utf-8。value.encode('utf-8')然后我得到一个字符串'AJDUK MARKO\xc4\x8d'。

当我尝试更新数据库时,插入 btw 的工作方式相同。

cur.execute( "UPDATE res_partner set %s = '%s' where id = %s;"%(columns, value, remote_partner_id))

AJDUK MARKO\xc4\x8d该值被插入或更新到数据库中,但问题是它的格式与我当然想要的完全相同 AJDUK MARKOČ。数据库有 utf-8 编码,所以不是这样。

我究竟做错了什么?令人惊讶的是在论坛上找不到任何有用的东西。

4

1 回答 1

4

\xc4\x8d是的UTF-8 编码表示Č看起来插入已经起作用,但您没有正确打印结果,可能是通过将整行打印为列表。IE

>>> print "Č"
"Č"
>>> print ["Č"] # a list with one string
['\xc4\x8c']

我们需要查看更多代码来验证(提供尽可能多的可重现代码总是一个好主意)。

您可以对结果 ( result.decode("utf-8")) 进行解码,但应避免手动编码或解码。Psycopg2 已经允许您发送 Unicode,因此您可以在不先编码的情况下执行以下操作:

cur.execute( u"UPDATE res_partner set %s = '%s' where id = %s;" % (columns, value, remote_partner_id))

- 注意前导u

Psycopg2 也可以通过自动解码字符串来返回 Unicode:

import psycopg2
import psycopg2.extensions
psycopg2.extensions.register_type(psycopg2.extensions.UNICODE)
psycopg2.extensions.register_type(psycopg2.extensions.UNICODEARRAY)

编辑:

SQL 值应作为参数传递给.execute(). 请参阅大红框:http: //initd.org/psycopg/docs/usage.html#the-problem-with-the-query-parameters

取而代之的是

# Replace the columns field first.
# Strictly we should use http://initd.org/psycopg/docs/sql.html#module-psycopg2.sql  
sql = u"UPDATE res_partner set {} = %s where id = %s;".format(columns) 
cur.execute(sql, (value, remote_partner_id))
于 2016-01-05T10:13:38.017 回答