如何在Python中编码(utf8mb4)

时间:2014-10-23 16:22:35

标签: python mysql encoding utf-8

如何用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应用程序。请帮忙!

4 个答案:

答案 0 :(得分:20)

为了表情符号和U + FFFF代码点以外的其他字符,我在Python和MySQL之间正确交换了全系列的UTF-8字符,我一直在努力。

为了确保一切正常,我必须做以下事情:

  1. 确保utf8mb4用于MySQL中的CHARVARCHARTEXT
  2. 在Python中强制执行UTF-8
  3. 强制在Python和MySQL之间使用UTF-8
  4. 要在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()
    

    这样,您就不需要使用encodeutf8_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=Truehandles SET NAMES and SET character_set_connection),然后将Python端的所有文本作为Unicode文本处理。

答案 2 :(得分:2)

use_unicode=True对我没用。

我的解决方案

  • 在mysql中,将整个数据库,表和字段编码更改为utf8mb4
  • 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'。