将数字字段解释为SQL中的字符串

时间:2018-05-10 02:33:49

标签: sql postgresql

我的Postgres数据库中有一个64位整数字段,其中填充了64位整数。 (非)巧合的是,这些数字实际上是ASCII格式的8个字符串,小端。例如,数字5208208757389214273是字符串“ABCDEFGH”的数字表示形式:十六进制为0x4847464544434241,其中0x41为A,0x42为B,0x43为C等等。

我想将这些数字完全转换为显示目的 - 即找到一种方法将它们作为数字留在数据库中,但是在查询时能够将它们看作字符串。有没有办法在SQL中做到这一点?如果不是在SQL中,我可以在服务器端做什么(安装扩展,存储过程,任何东西),这将允许这样做?这个问题可以通过任何脚本或编程语言轻松解决,但我不知道如何用SQL解决它。

P.S。还有一次触发快乐的重复锤子产生一堆 - 这不是将数字翻译为5208208757389214273到字符串“5208208757389214273”的问题(我们有很多关于如何做到这一点的答案,但这不是我在寻找什么。)

1 个答案:

答案 0 :(得分:2)

使用Clubs::find () ->alias ( 'c' ) ->select ( [ new \yii\db\Expression ( 'c.[[id]], count(cu.[[id]]) as total' ) ] ) ->joinWith( ['clubUsers cu'] ) ->groupBy ( 'c.id' ) ->all (); 获取数字的十六进制表示。然后使用to_hex()将其转换为decode()。 (很遗憾,我没有找到从byteabigint的任何直接方式。)由于字节顺序,将其投放到byteatext

reverse()

reverse(decode(to_hex(5208208757389214273), 'hex')::text)

ABCDEFGH必须设置为bytea_output才能正常使用 - 使用'escape'

(在版本9.4和9.6上测试。)

在不使用SET bytea_output = 'escape';的情况下实现相同的rsult的另一种方法如下:

SET