Я в процессе преобразования некоторых инструментов, которые используют MySQL для PostgreSQL. При этом я столкнулся с рядом проблем, но смог найти больше всего. У меня проблема: HEX()
и UNHEX()
. Я пробовал encode(%s, 'hex')
и decode(%s, 'hex')
, которые фактически перестали заставлять меня иметь ошибки, но, похоже, это все равно не помогло. Кто-нибудь имеет представление о том, что эквивалент этих функций будет в Postgres?
Вот старый запрос MySQL:
SELECT HEX(test_table.hash),
title,
user,
reason,
description,
url,
performed,
comment,
authenticated,
status
FROM alerts
JOIN user_responses ON test_table.hash = user_responses.hash
JOIN test_status ON test_table.hash = test_status.hash
WHERE status = %s
И вот мой обновленный запрос в формате PostgreSQL:
SELECT encode(test_table.hash, 'hex') as hash,
title,
user,
reason,
description,
url,
performed,
comment,
authenticated,
status
FROM test_table
JOIN user_responses ON test_table.hash = user_responses.hash
JOIN test_status ON test_table.hash = test_status.hash
WHERE status = %s
Спасибо!
create function hex(text) returns text language sql immutable strict as $$
select encode($1::bytea, 'hex')
$$;
create function hex(bigint) returns text language sql immutable strict as $$
select to_hex($1)
$$;
create function unhex(text) returns text language sql immutable strict as $$
select encode(decode($1, 'hex'), 'escape')
$$;
select hex('abc'), hex(123), unhex(hex('PostgreSQL'));
Результат:
╔════════╤═════╤════════════╗ ║ hex │ hex │ unhex ║ ╠════════╪═════╪════════════╣ ║ 616263 │ 7b │ PostgreSQL ║ ╚════════╧═════╧════════════╝
Я рекомендую проверить библиотеку mysqlcompat для Postgres, она включает в себя целую кучу функций MySQL, перенесенных в Postgres.
Вы можете увидеть их реализации HEX или UNHEX. Обратите внимание, в частности, что функция hex hex имеет два разных режима работы:
Если аргумент является строкой, каждый символ в аргументе преобразуется в две шестнадцатеричные цифры.
Если аргумент десятичный, функция возвращает шестнадцатеричное строковое представление аргумента и рассматривается как длинный (BIGINT) номер.
Итак, если вы откатываете свой собственный, убедитесь, что вы поддерживаете все возможные варианты использования, как это делает mysqlcompat.