PostgresSQL从字符串字段读取二进制值



我在Postgres数据库中有一个类型为varchar的列,但其中存储了一个二进制值。如何以读取列的方式返回该列的二进制值?

例如,当我在列中看到"r"时,我想看到组成r值的1和0。


为了更清楚地了解我想要什么。我认为该应用程序将有关勾选复选框的数据存储在二进制文件中。因此,对于一组复选框:

  • 未选中(0(
  • 已检查(1(
  • 已检查(1(
  • 已检查(1(
  • 未选中(0(
  • 未选中(0(
  • 已检查(1(
  • 未选中(0(

它存储值"r",我想查看存储的值的二进制或十六进制。因此,对于值"r",我想得到十六进制值"72"或二进制值"0111 0010">

将二进制数据存储在文本列中不是一个好主意。您可以使用类型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;

根据文件:

输出格式取决于配置参数byta_output;默认值为十六进制。(注意,十六进制格式是在PostgreSQL 9.0中引入的;早期版本和一些工具不理解它。(

另请阅读文档:

  • 二进制数据类型
  • 二进制字符串函数和运算符
  • 位字符串类型
  • 位串函数和运算符

使用varchar是个坏主意。例如,不能以这种方式存储零字节。

无论如何,你的问题的答案应该是一个简单的类型转换:

CAST(textcol AS bytea)

最新更新