我在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)