SQL-операторы Python с греческими буквами и UTF-8 - PullRequest
0 голосов
/ 26 мая 2019

Версия: 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».

Где я иду не так?

1 Ответ

0 голосов
/ 26 мая 2019

Если я сделаю это:

>>> b"SELECT EXISTS(SELECT 1 FROM table_name WHERE column_name = '\xce\xa31')".decode("utf-8")
"SELECT EXISTS(SELECT 1 FROM table_name WHERE column_name = 'Σ1')"

это показывает, что вы не делаете ничего плохого. Запрос, который вы видите, отображается обратно в виде байтов UTF-8, но он точно такой же, как и запрос Unicode, который вы хотите. Я подозреваю, что греческий символ в базе данных не точно , что ваш select ожидает найти. Это может быть связано с тем, что на самом деле существует несколько сигма-знаков Unicode: U + 03A3, U + 2211 и несколько других, кроме .

...