Версия:
Postgresql = 11,3
Python = 3,7,3
У меня есть скрипт на python, который собирает данные из Интернета и сохраняет их в базе данных для дальнейшего анализа.
Приведенный ниже оператор sql всегда возвращает false, когда он пытается сравнить переменную, извлеченную из Интернета, с тем, что уже существует в базе данных. Я думаю, что это происходит из-за несоответствия в кодировке переменной.
В качестве примера, переменная = Σ1 и Σ1 уже существует в базе данных, поэтому приведенный ниже оператор sql должен возвращать TRUE, но вместо этого возвращает FALSE.
cur.execute("SELECT EXISTS(SELECT 1 FROM table_name WHERE column_name = %s)", (variable,))
Когда я запускаю "cur.query", он показывает, что выполняется следующий запрос:
b"SELECT EXISTS(SELECT 1 FROM table_name WHERE column_name = '\xce\xa31')"
В pgadmin4 переменная правильно хранится как Σ1. Если я запускаю SQL-запрос выше непосредственно в pgadmin4 с «Σ1», он возвращает true, как и ожидалось.
Но когда я запрашиваю, чтобы проверить, существует ли эта переменная в базе данных из скрипта python, он возвращает false, потому что он сравнивает «Σ1» в базе данных с «\ xce \ xa31» в запросе sql.
Когда я запускаю "show CLIENT_ENCODING;" в pgadmin4 он показывает «UTF8», а когда я печатаю «print (conn.encoding)» непосредственно перед оператором sql в моем скрипте, он также показывает «UTF8».
Где я иду не так?