大家好,我在将 utf-8 unicode 字符插入数据库时遇到问题。
我从表单中获得的 unicode 是 u'AJDUK MARKO\u010d'
。下一步是将其解码为 utf-8。 value.encode('utf-8')
然后我得到一个字符串 'AJDUK MARKO\xc4\x8d'。
当我尝试更新数据库时,插入顺便说一句,效果相同。
cur.execute( "UPDATE res_partner set %s = '%s' where id = %s;"%(columns, value, remote_partner_id))
该值被插入或更新到数据库,但问题是它的格式与 AJDUK MARKO\xc4\x8d
完全相同,当然我想要 AJDUK MARKOČ
>。数据库有 utf-8 编码,所以不是这样的。
我做错了什么?令人惊讶的是在论坛上找不到任何有用的东西。
最佳答案
\xc4\x8d
是 Č
的 UTF-8 编码表示。看起来插入已经起作用,但您没有正确打印结果,可能是将整行打印为列表。即
>>> 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))
关于python-2.7 - python通过psycopg2 unicode字符插入postgres,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34601334/