Python 2.7 python在psycopg2 unicode字符上插入到postgres

Python 2.7 python在psycopg2 unicode字符上插入到postgres,python-2.7,unicode,psycopg2,postgresql-9.3,pgdb,Python 2.7,Unicode,Psycopg2,Postgresql 9.3,Pgdb,大家好,我在数据库中插入utf-8 unicode字符时遇到问题 我从表单中获得的unicode是u'AJDUK MARKO\u010d'。下一步是将其解码为utf-8值。编码('utf-8')然后我得到一个字符串'AJDUK MARKO\xc4\x8d' 当我尝试更新数据库时,insert btw的工作原理也是一样的 cur.execute( "UPDATE res_partner set %s = '%s' where id = %s;"%(columns, value, remote_pa

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

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

当我尝试更新数据库时,insert 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编码,所以不是这样


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

\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()
。请参见以下位置的红色大框:

反而 例如


阿拉斯泰尔我打印结果不正确是什么意思?我用pg_admin查询表res_partner,可以看到它是用\xc4\x8d而不是Č插入数据库的。谢谢你的帮助,伙计。啊,我明白了。如果您接受我的建议,在传递到
cur.execute()
之前不进行编码,会发生什么情况?如果我不进行编码,只传递一个值,例如name='Markoč',那么它会起作用,但如果我在元组中发送多个列和值,那么它就不起作用。然后它说:ProgrammingError:type“u”不存在。你能用导致错误的代码更新你的问题吗?@HateCamel也面临着这个问题,现在我正在考虑使用
INSERT
update
表达式。。。关于在多列中插入数据,您发现了什么吗?
# 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))