【问题标题】:How to encode (utf8mb4) in Python如何在 Python 中编码(utf8mb4)
【发布时间】:2014-12-19 09:28:10
【问题描述】:

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

【问题讨论】:

  • 我猜你说的是 MySQL?如果是这样,那么 Python 的 utf8 应该与 MySQL 的 utf8mb4 相同。您能否更具体地说明您正在做什么以及您看到的结果?
  • 似乎 utf8mb4 是 MySQL 发明的,因为他们的 ut8 实现只适用于 BMP 字符。普通 utf8 不是这种情况,它可以编码任何 unicode 字符。这就是 Python 使用的编码。也许 MySQL 提供了一组函数来处理他们的自定义编码?
  • @MarkRansom 在问题中添加了更多内容以更具体
  • 目前尚不清楚 a) 在这两种情况下您的数据是什么样的,以及 b) 数据在不起作用时是什么样的。请明确定义您遇到的问题。

标签: python mysql encoding utf-8


【解决方案1】:

MySQL 的 utf8mb4 encoding 只是标准的 UTF-8

但他们必须添加该名称以将其与仅支持 BMP 字符的 broken UTF-8 character set 区分开来。

换句话说,从 Python 方面来说,在与 MySQL 通信时,您应该始终编码为 UTF-8,但要考虑到数据库可能无法处理 U+FFFF 以外的 Unicode 代码点,除非您使用 utf8mb4 在 MySQL 方面

但是,一般来说,您希望避免手动编码和解码,而是让MySQLdb 担心这一点。您可以通过配置连接和排序规则来透明地处理 Unicode 文本来做到这一点。对于MySQLdb,这意味着设置charset='utf8mb4'

database = MySQLdb.connect(
    host=hostname,
    user=username,
    passwd=password,
    db=databasename,
    charset="utf8mb4"
)

然后使用普通的 Python 3 str 字符串;将use_unicode 选项设置为默认的True*

注意:这个handles SET NAMES and SET character_set_connection)给你,不需要手动发出。


* 除非您仍然使用 Python 2,否则默认为 False。将其设置为True 并使用u'...' unicode 字符串。

【讨论】:

    【解决方案2】:

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

    为确保一切正常,我必须执行以下操作:

    1. 确保 utf8mb4 用于 MySQL 中的 CHARVARCHARTEXT
    2. 在 Python 中强制执行 UTF-8
    3. 强制在 Python 和 MySQL 之间使用 UTF-8

    要在 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等函数了。

    【讨论】:

    • 非常有用的清单。把我从热气腾腾的?中救了出来。
    • 这解决了我在使用 mysql + python + emojis 时遇到的问题?
    • coding仅适用于 Python 如何解码源代码中的字符串文字。不是如何处理 data 的编码和解码。除非这是 Python 2 并且您在字符串文字中使用了非 ASCII 字符,否则无需设置它。在 Python 3 中,UTF-8 是默认的源编码
    • 如果您使用的是 Python3,请注意这个答案!我有一个使用 utf8mb 排序规则的 MySQL 数据库。我将 MySQLdb 与 Python3 一起使用,我不需要做任何特别的事情来正确读取 unicode 字符。我尝试了你的建议,结果证明对数据执行某种双重编码,返回一些奇怪的 unicode 字符而不是正确的字符。
    • @baxeico 我不确定我是否曾经在 Python 3 中测试过我的答案。我知道上面是 Python 2 中的一个大问题。我将在 Python 3 中进行一些测试并更新我的答案。
    【解决方案3】:

    use_unicode=True 对我不起作用。

    我的解决方案

    • 在mysql中,将整个数据库、表和字段编码改为utf8mb4
    • MySQLdb.connect(host='###' [...], charset='utf8'
    • dbCursor.execute('SET NAMES utf8mb4')
    • dbCursor.execute("SET CHARACTER SET utf8mb4")

    【讨论】:

      【解决方案4】:

      您也可以通过以下方式输入您想要的代码类型

      mysql.connector.connect(host = '<host>', database = '<db>', user = '<user>', password = '<password>', charset = 'utf8')
      

      “”中的字段是您自己的详细信息。除了 'utf8' 你也可以写 'utf8mb4' 取决于你的 mysqldb 想要的编码类型。

      【讨论】:

        猜你喜欢
        • 2019-01-21
        • 1970-01-01
        • 2014-02-26
        • 1970-01-01
        • 2016-12-17
        • 2018-04-14
        • 2019-04-03
        • 2017-07-10
        • 1970-01-01
        相关资源
        最近更新 更多