【问题标题】:PyMySQL Warning: (1366, "Incorrect string value: '\\xF0\\x9F\\x98\\x8D t...')PyMySQL 警告:(1366,“不正确的字符串值:'\\xF0\\x9F\\x98\\x8D t...')
【发布时间】:2018-05-05 07:41:57
【问题描述】:

我正在尝试使用 Pandas 和 MySQL 将数据(推文和其他推特文本信息)导入数据库。我收到以下错误:

166:警告:(1366,“不正确的字符串值:'\xF0\x9F\x92\x9C\xF0\x9F...' 用于第 3 行的列 'text'”) 结果 = self._query(查询)

166:警告:(1366,“第 5 行的列 'text' 的字符串值不正确:'\xF0\x9F\x98\x8D t...'”) 结果 = self._query(查询)

经过彻底搜索后,我的数据库列的设置方式似乎有问题。我尝试将数据库字符集设置为 UTF8 并将其整理为 utf_unicode_ci,但仍然收到相同的错误。

以下是将数据导入数据库的代码:

#To create connection and write table into MySQL

engine = create_engine("mysql+pymysql://{user}:{pw}@{lh}/{db}?charset=utf8"
                       .format(user="user",
                               pw="pass",
                               db="blahDB",
                               lh="bla.com/aald/"))

df.to_sql(con=engine, name='US_tweets', if_exists='replace')

我要导入的数据包含以下数据类型:“int64”、“object”和“datetime64[ns]”。我通过使用

将数据打印到控制台发现了这些数据类型
print(df['tweett']) >>> returns dtype 'object'

感谢您的帮助,谢谢!

【问题讨论】:

    标签: python mysql pandas utf-8 pymysql


    【解决方案1】:

    在连接到 MySQL 和相关列时,您需要 utf8mb4,而不是 utf8

    更多python提示:http://mysql.rjweb.org/doc.php/charcoll#python(除了使用utf8mb4代替utf8UTF-8不应更改。)

    更详细的解释可以在here找到。

    【讨论】:

    • 上帝保佑瑞克。
    • 谢谢。像魔术一样工作。但是您如何看到更改为 utf8mb4 会解决问题的错误?有什么解释吗?
    • @Eswar - 在客户端和数据库表之间的某个步骤(我不知道在哪里),当它需要是“utf8mb4”时,它是“utf8”。注意:MySQL的“utf8”与外界的“UTF-8”不一样,它确实对应“utf8mb4”。
    • @RickJames stackoverflow.com/a/30074553/5658251。这个链接会更清楚地说明答案..
    • @Eswar - 是的,该链接很好地解释了 MySQL 的一对字符集之间的区别。但斯特林并没有在哪里找到他的“虫子”。非 BMP 代码是十六进制 F0xxyyzz。也就是说,F0 告诉我涉及 utf8mb4。错误消息的其余部分暗示这样一个 4 字节的“字符”正试图被填充到无法处理它的东西中,大概是 utf8。由于涉及到 Python,所以我拿出了关于 Python 和 utf8 的备忘单,希望答案就在那里。 (我不懂 Python。)
    【解决方案2】:

    更改数据库、表和列的字符集和排序规则属性以使用 utf8mb4 而不是 utf8。 docs

    # For each database:
    ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
    # For each table:
    ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
    # For each column:
    ALTER TABLE table_name CHANGE column_name column_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
    # (Don’t blindly copy-paste this! The exact statement depends on the column type, maximum length, and other properties. The above line is just an example for a `VARCHAR` column.)
    

    【讨论】:

      猜你喜欢
      • 2019-05-27
      • 1970-01-01
      • 1970-01-01
      • 2016-03-13
      • 2013-12-23
      • 2012-11-19
      • 2020-06-20
      • 2017-04-19
      相关资源
      最近更新 更多