大家好我在将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编码,因此不是这样。
我做错了什么?令人惊讶的是,在论坛上找不到任何有用的东西。
答案 0 :(得分:4)
\xc4\x8d
是Č
的UTF-8编码表示。看起来插件已经工作但是您没有正确打印结果,可能是将整行打印为列表。即。
>>> print "Č"
"Č"
>>> print ["Č"] # a list with one string
['\xc4\x8c']
我们需要查看更多代码才能验证(尽可能多地提供可重现的代码总是一个好主意。)
您可以解码结果(result.decode("utf-8")
),但应避免手动编码或解码。 Psycopg2已允许您发送Unicodes,因此您无需先编码即可执行以下操作:
cur.execute( u"UPDATE res_partner set %s = '%s' where id = %s;" % (columns, value, remote_partner_id))
- 请注意领先的u
Psycopg2也可以通过自动解码字符串来返回Unicodes:
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
相反 E.g。
# 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))