PyMySQL 警告: (1366, "不正确的字符串值: '\\xF0\\x9F\\x98\\x8D t...'")

10
我正在尝试使用Pandas和MySQL将数据(推文和其他Twitter文本信息)导入数据库。我收到了以下错误消息:
166: 警告:(1366,“列'text'中的值不正确:在第3行处的'xF0x9Fx92x9C xF0x9Fx...'”) result = self._query(query) 166: 警告:(1366,“列'text'中的值不正确:在第5行处的'xF0x9Fx98x8D tx...'”) result = self._query(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'

我很感激您的帮助,谢谢!

2个回答

13

愿上帝保佑你,Rick。 - Sterling King
谢谢。它像魔法一样有效。但是,通过看到错误,你如何知道改为utf8mb4会解决问题呢?有解释吗? - Eswar
@Eswar - 在客户端和数据库表之间的某个步骤(我不知道在哪里),有些东西是“utf8”,但实际上应该是“utf8mb4”。请注意:MySQL的“utf8”与外部世界的“UTF-8”不同,后者对应于“utf8mb4”。 - Rick James
@RickJames https://dev59.com/f10a5IYBdhLWcg3wqaNS#30074553。这个链接会对答案有更详细的解释。 - Eswar
1
@Eswar - 是的,那个链接很好地解释了MySQL字符集对之间的区别。但它并没有告诉Sterling在哪里找到他的“bug”。非BMP代码是十六进制F0xxyyzz。也就是说,“F0”告诉我涉及到了utf8mb4。错误消息的其余部分暗示着这样一个四字节的“字符”试图被塞入某些东西中,可能是utf8,而它无法处理它。由于涉及到Python,我拿出了我的Python和utf8的备忘单,希望答案在那里。(我不懂Python。) - Rick James
问题中的第一个字符。 - Rick James

1

将数据库、表和列的字符集和排序属性更改为使用utf8mb4而不是utf8。文档

# 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.)

我运行了所有的SQL查询,但仍然出现“不正确的字符串值”错误。我可能漏掉了什么? - JayB

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接