在Postgres中,MySQL的HEX()和UNHEX()等效?

时间:2017-06-28 22:14:18

标签: mysql sql postgresql

我正在将一些工具转换为使用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 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:2)

我建议查看Postgres的mysqlcompat库,它包含一大堆移植到Postgres的MySQL函数。

您可以看到HEXUNHEX函数的实现。特别要注意MySQL的十六进制函数有two different modes of working

  

如果参数是字符串,则参数中的每个字符都将转换为两个十六进制数字。

     

如果参数为十进制,则该函数返回参数的十六进制字符串表示形式,并将其视为longlong(BIGINT)数字。

因此,如果你自己动手,请确保你支持所有可能的用例,就像mysqlcompat那样。