HEX () и UNHEX () в MySQL эквивалентны в Postgres?

6

Я в процессе преобразования некоторых инструментов, которые используют 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

Спасибо!

Теги:

2 ответа

4
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 ║
╚════════╧═════╧════════════╝
2

Я рекомендую проверить библиотеку mysqlcompat для Postgres, она включает в себя целую кучу функций MySQL, перенесенных в Postgres.

Вы можете увидеть их реализации HEX или UNHEX. Обратите внимание, в частности, что функция hex hex имеет два разных режима работы:

Если аргумент является строкой, каждый символ в аргументе преобразуется в две шестнадцатеричные цифры.

Если аргумент десятичный, функция возвращает шестнадцатеричное строковое представление аргумента и рассматривается как длинный (BIGINT) номер.

Итак, если вы откатываете свой собственный, убедитесь, что вы поддерживаете все возможные варианты использования, как это делает mysqlcompat.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню