gpt4 book ai didi

python - Python 3 和 MySQL 连接器的 Unicode 和参数数量错误

转载 作者:行者123 更新时间:2023-12-01 06:22:23 25 4
gpt4 key购买 nike

我正在尝试在 Python 3 中对 MySQL(MariaDB) 数据库执行简单的 SELECT 查询。

我遇到了非常奇怪的错误

        query = (
'SELECT user_id, user_password_hash, user_password_salt '
'FROM users '
'WHERE user_username = "%s"'
)

print(f'Trying login, username {username}, password {password}')

try:
cursor = self.connection.cursor(prepared=True)
cursor.execute(query, (username,))

results = cursor.fetchone()

print(results)
...

except Error as e:
print('Error in login query: ' + str(e))
raise e

运行此代码会出现以下错误: Error in login query: 1210: Incorrect number of arguments executing prepared statement

我不明白 - 它需要一个参数,而我已经给了它一个参数。删除 execute() 中元组中的逗号并没有解决这个问题。

现在,如果我从查询中删除引号,则会收到完全不同的错误:

        query = (
'SELECT user_id, user_password_hash, user_password_salt '
'FROM users '
'WHERE user_username = %s'
)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x9b in position 0: invalid start byte

The above exception was the direct cause of the following exception:

SystemError: <class 'UnicodeDecodeError'> returned a result with an error set

该表使用 utf8mb4,因此这应该不是问题。

另外,运行 SELECT * FROM users WHERE user_username="jeff"在 MySQL 控制台中工作正常。

这应该是一个非常简单的查询,但我完全不知道发生了什么 - 任何帮助将不胜感激。

编辑:在独立的 Python 进程中进行实验时,我通过运行以下命令重现了该问题:

import mysql.connector

conn = mysql.connector.connect(host="localhost",
database="lucidlab",
user="lucidlab",
password="lucidlab")

cur = conn.cursor()
cur.execute("SELECT * FROM users WHERE user_username='jeff'")

results = cur.fetchall() # ERROR
print(results)

这让我觉得也许是数据库编码问题?

编辑:我已经解决了这个问题。请参阅下面我的回答。

最佳答案

我发现问题了。修复它需要查看架构,不幸的是我没有发布 - 经验教训。

我的架构包含以下内容:

CREATE TABLE users (
...
user_password_hash BINARY(20) NOT NULL,
user_password_salt BINARY(20) NOT NULL,
...
);

运行任何类型的SELECT * FROM users...查询都会检索此二进制数据,Python 会立即将其转换为 UTF-8 字符串。 ..失败了,因为盐是从 os.urandom() 生成的字节。

我通过使用 passlib 库中的 sha256_crypt 来修复此问题,并将编码的哈希+盐组合存储为 CHAR(77)

感谢那些提供帮助的人 - 不幸的是,我对这个问题的思考太狭隘了,因此这样表达了我的问题。

关于python - Python 3 和 MySQL 连接器的 Unicode 和参数数量错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60300884/

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