我正在将一些工具转换为使用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
谢谢!
答案 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函数。
您可以看到HEX或UNHEX函数的实现。特别要注意MySQL的十六进制函数有two different modes of working:
如果参数是字符串,则参数中的每个字符都将转换为两个十六进制数字。
如果参数为十进制,则该函数返回参数的十六进制字符串表示形式,并将其视为longlong(BIGINT)数字。
因此,如果你自己动手,请确保你支持所有可能的用例,就像mysqlcompat那样。