【问题标题】:How to read non-english characters from database in Python?如何在 Python 中从数据库中读取非英文字符?
【发布时间】:2016-11-24 16:04:14
【问题描述】:

我正在尝试使用 pymysql 从 python 中的 mysql db 读取条目。数据库中的条目使用区域语言。 例如74 погода 就是这样一个条目 我写过这样的代码:

import pymysql
conn = pymysql.connect(ip, user, pass, db, charset="utf8")
curr = conn.cursor()
curr.execute("select val from my_table")
r = cur.fetchone()

>>> r
('74 ??????',)
>>> r[0].encode("utf-8").strip()
'74 \xd0\xbf\xd0\xbe\xd0\xb3\xd0\xbe\xd0\xb4\xd0\xb0'

这里我没有得到数据库中存在的数据。

【问题讨论】:

  • 请让我们知道,@AnatoliiChmykhalo 也是您身边的蟒蛇大师
  • 这是打印它的简单方法:a = '74 \xd0\xbf\xd0\xbe\xd0\xb3\xd0\xbe\xd0\xb4\xd0\xb0' >>> print a.decode("utf-8") 74 погода
  • 请指定您使用的 Python 版本。
  • 您的示例对于 Python 2 似乎不一致(其中 pymysql 确实会返回一个字节字符串,但没有可以隐式解码然后编码的呈现 ?????? 的字节字符串恢复除问号以外的任何内容)或 Python 3(其中 pymysql 将返回一个 unicode 字符串,如果您的终端严重损坏,它可能会呈现为问号;但随后会显示带有 b'' 前缀的编码字节字符串) .最后你的 UTF-8 编码输出看起来不错。

标签: python mysql unicode


【解决方案1】:

这是因为 MySQLdb 通常会尝试将所有内容编码为 latin-1。这可以通过在建立连接后立即执行以下命令来解决:

db.set_character_set('utf8')
dbc.execute('SET NAMES utf8;')
dbc.execute('SET CHARACTER SET utf8;')
dbc.execute('SET character_set_connection=utf8;')

db 是 MySQLdb.connect() 的结果,dbc 是 `db.cursor()* 的结果。

【讨论】:

  • OP 已经在 connect() 调用中将连接编码设置为 UTF-8。 pymysql 没有set_character_set 方法。你永远不应该尝试通过执行查询来设置连接编码——这只会改变服务器端将使用的编码,并且不会让客户端知道正在使用什么编码,这可能会导致其转义失败(东亚的安全漏洞编码)。将所有这些SET 查询扔给它纯粹是迷信。
猜你喜欢
  • 1970-01-01
  • 2017-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-01
  • 2011-09-03
  • 2019-06-01
  • 1970-01-01
相关资源
最近更新 更多