web-dev-qa-db-ja.com

MySQLのHEX()およびUNHEX()はPostgresで同等ですか?

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

ありがとう!

11
Neemaximo
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║
╚══ ══════╧═════╧════════════╝
8
Abelisto

Postgres用の mysqlcompat ライブラリをチェックアウトすることをお勧めします。これには、Postgresに移植されたMySQL関数のすべてが含まれています。

[〜#〜] hex [〜#〜] または [〜#〜] unhex [〜#〜] 関数の実装を確認できます。 MySQLの16進関数には 2つの異なる動作モード があることに特に注意してください。

引数が文字列の場合、引数の各文字は2桁の16進数に変換されます。

引数が10進数の場合、関数は引数の16進数の文字列表現を返し、longlong(BIGINT)数として扱われます。

そのため、独自にロールする場合は、mysqlcompatが行うように、考えられるすべてのユースケースを確実にサポートしてください。

2