Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python3和MySQL连接器的Unicode和错误参数数错误_Python_Mysql_Mariadb_Prepared Statement - Fatal编程技术网

Python3和MySQL连接器的Unicode和错误参数数错误

Python3和MySQL连接器的Unicode和错误参数数错误,python,mysql,mariadb,prepared-statement,Python,Mysql,Mariadb,Prepared Statement,我试图在Python3中的MySQL(MariaDB)数据库上执行一个简单的SELECT查询 我犯了一些奇怪的错误 query=( '选择用户id、用户密码\u哈希、用户密码\u salt' “来自用户” 'WHERE user_username=“%s”' ) 打印(f'尝试登录,用户名{username},密码{password}') 尝试: cursor=self.connection.cursor(prepared=True) cursor.execute(查询,(用户名,)) 结果=c

我试图在Python3中的MySQL(MariaDB)数据库上执行一个简单的SELECT查询

我犯了一些奇怪的错误

query=(
'选择用户id、用户密码\u哈希、用户密码\u salt'
“来自用户”
'WHERE user_username=“%s”'
)
打印(f'尝试登录,用户名{username},密码{password}')
尝试:
cursor=self.connection.cursor(prepared=True)
cursor.execute(查询,(用户名,))
结果=cursor.fetchone()
打印(结果)
...
除错误e外:
打印('登录查询出错:'+str(e))
提高e
运行此代码会导致以下错误:
登录查询错误:1210:执行已准备语句的参数数量不正确

我不明白-它需要一个论点,我给了它一个论点。 在
execute()
中删除元组中的逗号并不能解决此问题

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

query=(
'选择用户id、用户密码\u哈希、用户密码\u salt'
“来自用户”
'其中用户\u用户名=%s'
)
这让我觉得可能是数据库编码问题


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

尝试使用双引号:

    query = ("SELECT user_id, user_password_hash, user_password_salt "
        "FROM users "
        "WHERE user_username = %s"
    )
或三重引语:

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


query=“”选择用户\u id、用户\u密码\u散列、用户\u密码\u salt
来自用户
其中用户\u用户名=%s”“”


用这个它会工作的。

我发现了问题。修复它需要查看模式,不幸的是,我没有在总结经验教训后查看模式

我的模式包含以下内容:

创建表用户(
...
用户密码哈希二进制(20)不为空,
用户密码盐二进制(20)不为空,
...
);
运行任何类型的
SELECT*FROM users…
查询都会检索此二进制数据,Python会立即将其转换为UTF-8字符串,这非常有用(!)。。。这会失败,因为salt是从
os.uradom()
生成的字节

我改为使用
passlib
库中的
sha256\u crypt
,并将我编码的hash+salt组合存储为
CHAR(77)


感谢那些帮助过我的人——不幸的是,我对这个问题考虑得太狭隘了,因此我的问题措辞也是这样。

query=(“从用户中选择用户id、用户密码、用户密码,其中用户用户名=%s”)
给出了我上面描述的unicode错误-即,
UnicodeDecodeError:“utf-8”编解码器无法解码位置0中的字节0x9b:无效的起始字节
编辑:三个引号做同样的事情。顺便说一句,谢谢你这么快回复!这不起作用-它给了我在问题
UnicodeDecodeError:“utf-8”编解码器无法解码位置0处的字节0x9b中提到的unicode解码错误:无效的开始字节上述异常是以下异常的直接原因:SystemError:返回一个错误集的结果
如果您在调用
connect
时指定
charset='utf8'
?唯一的区别是,现在我得到的是
无效的继续字节
,而不是
无效的开始字节
。这似乎是一个编码问题,但没有重现问题或完整回溯的架构和数据,很难确切知道问题出在哪里。我倾向于建议在连接中尝试不同的编码(你可能无论如何都在尝试),这是一个编码问题,但它是一个相反方向的编码。二进制数据存储在数据库中,python在内部自动将其转换为UTF-8字符串,但失败了。谢谢你的帮助!
    query = ("""SELECT user_id, user_password_hash, user_password_salt 
        FROM users 
        WHERE user_username = %s"""
    )