gpt4 book ai didi

python - 如何使用 Python 3 在 MySQL 中避免 b' 和 UTF-8 文字

转载 作者:行者123 更新时间:2023-11-29 02:41:19 28 4
gpt4 key购买 nike

我是新手。所以我试图解析 html 页面并将内容放在 MySQL 的列中,但是我似乎无法让实际的外来字符出现,例如代替 á 我得到 xc3xa1。我的表有 utf8mb4 作为它的字符集和排序规则 utf8mb4_unicode_ci。我有以下设置:

Database_cnx = pymysql.connect(user='XXXX', password='XXXX',
host='XXXX',
database='XXXX',
use_unicode=True,
charset='utf8mb4')

article_content = str(row[3].encode("utf-8")).replace("'", "\'").replace("\"", "\'")

q_i = ("INSERT INTO article_items (" + ", ".join(article_table_col_name_new) + ")"
"VALUES ({:d}, \"{:s}\", \"{:s}\", \"{:s}\", \"{:s}\", \"{:s}\", \"{:s}\")".format(row[0], urlparse(row[1]).netloc, row[1], row[2].replace("\"", "'"), article_content, datetime.fromtimestamp(row[4]).strftime("%Y-%m-%d"), updated)
)

那么我怎么才能让我的专栏中只出现实际的文章内容,而不是 b' 字节和 utf-8 文字。谢谢

最佳答案

问题是您将字符串显式编码为 UTF-8 字节,然后将该 UTF-8 字节转换为其字符串表示形式。

这就是这段代码的意思:

str(row[3].encode("utf-8"))

如果你不想那样做,那就别那样做:

row[3]

这是一个显示您正在做的事情的示例:

>>> s = 'à'
>>> s
'à'
>>> s.encode('utf-8')
b'\xc3\xa0'
>>> str(s.encode('utf-8'))
"b'\\xc3\\xa0'"

这里你要的是第一个。

更一般地说,在 bytes 上调用 str 几乎没有用。如果你不可避免地有一个 bytes 而你需要一个 str,你可以通过调用 decode 方法来获得它。但在这种情况下,您不会不可避免地拥有 bytes。 (我的意思是,您可以编写row[3].encode("utf-8").decode("utf-8"),但这显然很漂亮傻。)


作为旁注——但也是非常重要的一点——您不应该尝试将您的值str.format 到SQL 字符串中。只需使用查询参数。 Here's the obligatory xkcd link这解释了安全性/安全性问题,最重要的是,您使代码变得更加复杂,甚至效率更低。

换句话说,不是这样做:

"VALUES ({:d}, \"{:s}\", \"{:s}\", \"{:s}\", \"{:s}\", \"{:s}\", \"{:s}\")".format(row[0], urlparse(row[1]).netloc, row[1], row[2].replace("\"", "'"), article_content, datetime.fromtimestamp(row[4]).strftime("%Y-%m-%d"), updated)

... 只需这样做:

"VALUES (%s, %s, %s, %s, %s, %s, %s)"

然后,当您稍后执行查询时,将参数作为参数传递给 execute,无需所有复杂的字符串转换、引用和替换嵌入的引号,只需按原样传递值.

db.execute(q_i, (
row[0], urlparse(row[i]).netloc, row[1], row[2], article_content,
datetime.fromtimestamp(row[4]).strftime("%Y-%m-%d"), updated))

事实上,如果您的倒数第二列是(或可能是)DATETIME 列而不是 CHAR/VARCHAR/TEXT/whatever,你甚至不需要那个strftime;只需传递 datetime 对象即可。

请注意,这意味着您根本不需要对 article_content 执行任何操作。引用的东西既不是必需的也不是一个好主意(除非你有其他一些特定于应用程序的原因需要避免文章中的 " 字符),并且编码的东西没有解决任何问题,但是只会引起新的。

关于python - 如何使用 Python 3 在 MySQL 中避免 b' 和 UTF-8 文字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51451747/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com