如何用Python在ut8mb4中编码?
我有两组数据:数据我将从Parse迁移到我的新MySQL数据库,而数据将继续(仅与我的新数据库对话)。我的数据库是utf8mb4,以存储表情符号和重音字母。
当我在python脚本中时,第一组数据只能正确显示(当涉及表情符号和重音时):
MySQLdb.escape_string(unicode(xstr(data.get('message'))).encode('utf-8'))
当从PHP中读取MySQL数据库时:
$row["message"] = utf8_encode($row["message"]);
当我不包括utf8_encode($row["message"])
部分时,第二组数据仅正确显示(当涉及表情符号和重音时)。我正在尝试协调这些,以便将两组数据正确地返回到我的iOS应用程序。请帮忙!
答案 0 :(得分:20)
为了表情符号和U + FFFF代码点以外的其他字符,我在Python和MySQL之间正确交换了全系列的UTF-8字符,我一直在努力。
为了确保一切正常,我必须做以下事情:
utf8mb4
用于MySQL中的CHAR
,VARCHAR
和TEXT
列要在Python中强制执行UTF-8,请将以下行添加为Python脚本的第一行或第二行:
# -*- coding: utf-8 -*-
要在Python和MySQL之间强制执行UTF-8,请按如下方式设置MySQL连接:
# Connect to mysql.
dbc = MySQLdb.connect(host='###', user='###', passwd='###', db='###', use_unicode=True)
# Create a cursor.
cursor = dbc.cursor()
# Enforce UTF-8 for the connection.
cursor.execute('SET NAMES utf8mb4')
cursor.execute("SET CHARACTER SET utf8mb4")
cursor.execute("SET character_set_connection=utf8mb4")
# Do database stuff.
# Commit data.
dbc.commit()
# Close cursor and connection.
cursor.close()
dbc.close()
这样,您就不需要使用encode
和utf8_encode
等功能。
答案 1 :(得分:16)
MySQL' utf8mb4
encoding 只是标准的UTF-8 。
他们必须添加该名称,以区别于仅支持BMP字符的broken UTF-8 character set。
换句话说,在与MySQL交谈时应始终编码为UTF-8,但要考虑到数据库可能无法处理超出U + FFFF的Unicode代码点,除非您使用utf8mb4
在MySQL方面。
一般来说,您希望避免手动编码和解码。配置连接和排序规则以便为您处理Unicode。对于MySQLdb
,这意味着设置charset='utf8'
(设置use_unicode=True
和handles SET NAMES
and SET character_set_connection
),然后将Python端的所有文本作为Unicode文本处理。
答案 2 :(得分:2)
use_unicode=True
对我没用。
我的解决方案
MySQLdb.connect(host='###' [...], charset='utf8'
dbCursor.execute('SET NAMES utf8mb4')
dbCursor.execute("SET CHARACTER SET utf8mb4")
答案 3 :(得分:2)
您还可以通过以下方式输入所需的代码类型
mysql.connector.connect(host = '<host>', database = '<db>', user = '<user>', password = '<password>', charset = 'utf8')
“ <>”内的字段是您自己的详细信息。除了'utf8'之外,您还可以根据mysqldb想要的编码类型编写'utf8mb4'。