Postgresql Postgres SQL从字符串字段读取二进制值?
我在Postgres数据库中有一个类型为varchar的列,但其中存储了一个二进制值。 如何以我可以读取的方式返回列的二进制值 例如,当我在列中看到“r”时,我想看到组成r值的1和0Postgresql Postgres SQL从字符串字段读取二进制值?,postgresql,Postgresql,我在Postgres数据库中有一个类型为varchar的列,但其中存储了一个二进制值。 如何以我可以读取的方式返回列的二进制值 例如,当我在列中看到“r”时,我想看到组成r值的1和0 更清楚地知道我想要什么。 我认为该应用程序正在以二进制形式存储有关勾选复选框的数据。 因此,对于一组复选框: 未选中(0) 核对(1) 核对(1) 核对(1) 未选中(0) 未选中(0) 核对(1) 未选中(0) 它存储值“r”,我想查看存储的值的二进制或十六进制。因此,对于值“r”,我想使用varchar获
更清楚地知道我想要什么。 我认为该应用程序正在以二进制形式存储有关勾选复选框的数据。 因此,对于一组复选框:
- 未选中(0)
- 核对(1)
- 核对(1)
- 核对(1)
- 未选中(0)
- 未选中(0)
- 核对(1)
- 未选中(0)
它存储值“r”,我想查看存储的值的二进制或十六进制。因此,对于值“r”,我想使用
varchar
获得十六进制值“72”或二进制值“01110010”,因为这是个坏主意。例如,不能以这种方式存储零字节
无论如何,您的问题的答案应该是简单的类型转换:
CAST(textcol AS bytea)
在文本列中存储二进制数据不是一个好主意。您可以使用bytea类型,例如:
drop table if exists my_table;
create table my_table(id serial primary key, switch bytea);
insert into my_table (switch) values
('\x7272'),
('\x1111'),
('\xffff');
您可以轻松设置和获取十六进制格式的值,将其转换为位字符串,获取/设置单个字节/位,例如:
select id,
switch,
right(switch::text, -1)::bit(16) as bits,
right(switch::text, -1)::bit(16)::int as int,
get_byte(switch, 0)
from my_table;
id | switch | bits | int | get_byte
----+--------+------------------+-------+----------
1 | \x7272 | 0111001001110010 | 29298 | 114
2 | \x1111 | 0001000100010001 | 4369 | 17
3 | \xffff | 1111111111111111 | 65535 | 255
(3 rows)
您可以将text
(varchar
)强制转换为bytea
:
select 'r'::bytea;
bytea
-------
\x72
(1 row)
请注意,在某些工具(如PgAdmin III)中,应设置参数以获得十六进制输出:
set bytea_output to hex;
根据文件:
输出格式取决于配置参数bytea_output;默认值为十六进制。(注意,十六进制格式是在PostgreSQL 9.0中引入的;早期版本和一些工具不理解它。)
另请阅读文档:
bytea
强制转换为bit variable
。如果textcol
包含反斜杠,则此操作无效。@cstork将反斜杠加倍是否有帮助?是的,完全正确。;-)我刚刚遇到了这个问题,也许你知道一种不用这个难看的replace(textcol,'\','\\')来解决这个问题的方法。
绕道?在我看来,不知何故,必须能够访问textcol
的二进制表示形式,而不必首先转换整个字符串来接收您刚开始使用的内容,而是键入bytea
。有什么想法吗?