首页 > 解决方案 > 在 SQL 中将数字字段解释为字符串

问题描述

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

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

PS 对于一些触发快乐的重复锤子产生的一堆来说,再多一次 - 这不是将数字如 5208208757389214273 转换为字符串“5208208757389214273”的问题(我们有很多关于如何做到这一点的答案,但这是不是我要找的东西)。

标签: sqlpostgresql

解决方案


用于to_hex()获取数字的十六进制表示。然后用decode()它变成一个bytea. (不幸的是,我没有找到从bigintto 的任何直接方法。)由于字节顺序,将其bytea投射到text和它。reverse()

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

ABCDEFGH

bytea_output必须设置为'escape'才能正常工作 - 使用SET bytea_output = 'escape';.

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

在不使用的情况下实现相同结果的另一种方法SET如下:

select reverse(encode(decode(to_hex(5208208757389214273),'hex'),'escape'))

推荐阅读