programing

Python 3 및 MySQL 커넥터의 유니코드 및 잘못된 인수 수 오류

powerit 2023. 7. 22. 10:28
반응형

Python 3 및 MySQL 커넥터의 유니코드 및 잘못된 인수 수 오류

파이썬 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().

나는 대신에 이것을 사용하여 고쳤습니다.sha256_crypt에서passlib라이브러리, 그리고 인코딩된 해시+디버깅 조합을 저장합니다.CHAR(77).

도움을 준 사람들 덕분에 - 불행하게도, 저는 그 문제에 대해 너무 좁게 생각하고 있었고, 그래서 제 질문을 그렇게 표현했습니다.

큰따옴표를 사용해 보십시오.

    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 = """SELECT user_id, user_password_hash, user_password_salt FROM users WHERE user_username = %s"""

이것을 사용하면 효과가 있을 것입니다.

언급URL : https://stackoverflow.com/questions/60300884/unicode-and-incorrect-number-of-arguments-errors-with-python-3-and-mysql-connect

반응형