gpt4 book ai didi

python - 在 Python 中为 MySQL 转义 unicode 字符串(避免异常。UnicodeEncodeError)

转载 作者:可可西里 更新时间:2023-11-01 07:13:02 24 4
gpt4 key购买 nike

我正在使用 Twisted 在 Python 中异步访问我们的数据库。我的代码如下所示:

from twisted.enterprise import adbapi
from MySQLdb import _mysql as mysql

...

txn.execute("""
INSERT INTO users_accounts_data_snapshots (accountid, programid, fieldid, value, timestamp, jobid)
VALUES ('%s', '%s', '%s', '%s', '%s', '%s')
""" % (accountid, programid, record, mysql.escape_string(newrecordslist[record]), ended, jobid))

这一直有效,直到我遇到这个字符:®,这导致线程抛出异常:`exceptions.UnicodeEncodeError: 'ascii' codec can't encode character u'\xae' in position 7: ordinal不在范围内(128)

但是,如果我不使用 MySQLdb_mysql.escape_string(),当输入包含引号等(当然)时,我会收到数据库错误。异常发生在访问数据库之前,因此数据库的排序规则似乎根本无关紧要。

在不对 unicode 字符抛出异常的情况下转义此内容的最佳方法是什么?理想的解决方案是我可以将不会干扰查询的 unicode 字符传递给不受干扰的 MySQL;但是,剥离 unicode 字符的字符串,将它们替换为问号,对它们进行处理或任何其他可以阻止崩溃的方法都是可以接受的。

最佳答案

不要像这样格式化字符串。这是一个巨大的安全漏洞。自己不可能正确地引用。不要尝试。

使用第二个参数来“执行”。简单地说,代替 txn.execute("... %s, %s ..."% ("xxx", "yyy")),做 txn.execute("... %s, %s ...", ("xxx", "yyy"))。注意逗号而不是百分号。在其他数据库中或使用不同的数据库绑定(bind),您可能会使用不同的字符而不是“%s”,例如 ?:1, :2, :3:foo:, :bar:, :baz: 但思路是一样的。 (如果您对替代方案感到好奇,可以查看 paramstyle in the DB-API 2.0 documentation 的文档。)

I've written about this in the past .您可能对该帖子的讨论特别感兴趣。

还请让我强调一下,这是唯一正确的做法。您可能已经看到 MySQL 文档谈论以各种方式引用字符串。您可能已经用 PHP 编写了应用程序,但缺少传递数据库参数的适当工具。我保证所有这些信息来源都是不正确的,并会导致严重和持续的安全问题:不要将参数插入到您的 SQL 字符串中。

关于python - 在 Python 中为 MySQL 转义 unicode 字符串(避免异常。UnicodeEncodeError),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3956906/

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