提问人:TechnoSwiss 提问时间:7/29/2023 更新时间:7/29/2023 访问量:44
Python MySQL不对查询参数的代理进行编码
Python MySQL doesn't encode surrogates for query parameters
问:
运行尝试了 Python3.7 和 Python3.8,以及 mysql-connector-python 8.0.13 和 8.1.0
MySQL的5.7.42
数据库上的排序规则设置为“utf8mb4_unicode_520_ci”
来自 Python 的连接是:
db = None
db = mysql.connector.connect(
host="localhost",
user=username,
passwd=password,
database=eventdb,
charset="utf8mb4",
use_unicode=True
)
cur = None
cur = db.cursor(dictionary=True)
我有一个来自 json.dump 的字符串,并尝试使用它运行参数化查询:
data["name"] = '\udced\udca0\udcbe\udced\udcb7\udca1\n\n\udced\udca0\udcbe\udced\udcb7\udca1\n\n♡ADANA♡♡EOMON♡'
sql = "SELECT db_name_id FROM db_name WHERE name = %s"
val = (data["name"],)
curr.execute(sql_text, sql_val)
mysql-connector-python 8.0.13 在两个版本的 Python 上都返回UnicodeEncodeError: 'utf-8' codec can't encode characters in position 0-5: surrogates not allowed
Python.38 上的 mysql-connector-python 8.1.0 返回_mysql_connector.MySQLInterfaceError: Failed converting Python 'str'
但是,如果我执行一个简单的查询:
cur.execute(SELECT db_name_id FROM db_name WHERE name = '\udced\udca0\udcbe\udced\udcb7\udca1\n\n\udced\udca0\udcbe\udced\udcb7\udca1\n\n♡ADANA♡♡EOMON♡')
然后它执行没有错误,这是一个用户输入的字段,我真的不想在没有参数的情况下进行查询。
复制我看到的异常错误的最简单示例是直接使用 C 扩展:
import _mysql_connector
ccnx = _mysql_connector.MySQL()
ccnx.connect(
host="localhost",
user="user",
password="password",
database="database"
)
bad_str = 'just_an_��_example'
try:
str_converted = ccnx.convert_to_mysql(*[bad_str])
print('str converted is %s', str_converted)
except Exception as e:
print('cant convert bad str %s',bad_str)
print(e)
我只用 mysql-connector-python 8.1.0 测试过。
如果我根据信息 MySQL Bug 99757 进行以下更改,则convert_to_mysql有效:
import _mysql_connector
ccnx = _mysql_connector.MySQL()
ccnx.connect(
host="localhost",
user="user",
password="password",
database="database"
)
ccnx.set_character_set('utf8')
bad_str = 'just_an_��_example'
try:
str_converted = ccnx.convert_to_mysql(*[bad_str])
print('str converted is %s', str_converted)
except Exception as e:
print('cant convert bad str %s',bad_str)
print(e)
在某些情况下,似乎对 mysql 字符串的转换被破坏了,包括带有代理项的参数化字符串。我希望我错过了一些东西。
答: 暂无答案
评论
DCxx
convert_to_mysql
\uDCxx
convert_to_mysql
我相信是mysql-connector用来编码字符串以进入mysql的函数。我实际上不确定,它恰好是一个最小的代码示例,我相信它表明 mysql-connector 中存在潜在的错误以及它如何处理代理项对。