插入文本字符串,十六进制于PostgreSQL作为BYTEA

我有十六进制的这几串一个文本文件:

013d7d16d7ad4fefb61bd95b765c8ceb 007687fc64b746569616414b78c81ef1

我想存储,而不是一个 varchar这些数据库作为一个BYTEA。 也就是说,我想在数据库存储01为单字节00000001,而不是字符'0'和'1'。

我可以轻松地运行该文件通过sed将格式/逃脱它的任何方式,我需要。

这是我曾尝试:

create table mytable (testcol BYTEA);

这工作:

insert into mytable (testcol) values (E'\x7f\x7f');

但是,只要我有去上面\ 0x7F部分字节,出现此错误:

insert into mytable (testcol) values (E'\x7f\x80'); ERROR: invalid byte sequence for encoding "UTF8": 0x80

任何想法,还是我接近的东西错了吗?

--------------解决方案-------------

你可以转换一个十六进制字符串BYTEA使用decode功能(其中“编码”是指编码的二进制值一些文本值)。 例如:

select decode('DEADBEEF', 'hex');
decode
------------------
\336\255\276\357

这是更容易理解与9.0的默认输出:

decode
------------
\xdeadbeef

你不能只是说之所以E'\xDE\xAD\xBE\xEF'是,这是为了使一个文本值,而不是一个BYTEA,将让PostgreSQL的尝试将其从客户端的编码转换为数据库编码。 你可以写这样的BYTEA转义格式,但你需要加倍反引号E'\\336\\255\\276\\357'::bytea 。 我想,你可以看到为什么BYTEA格式正在改变....恕我直言decode()函数的书写输入一个合理的方式,即使有一些开销参与。

插入
mytable中(testcol)
VALUES
(解码('013d7d16d7ad4fefb61bd95b765c8ceb','六角'))

Ruby之道

最近,我需要读/自/至Postgres的写二进制数据,而是通过红宝石。 以下是我做到了使用PG库。

虽然不是严格的Postgres特有的,我想我有这个参考红宝石为中心的答案。

Postgres的DB设置

require 'pg'
DB = PG::Connection.new(host: 'localhost', dbname:'test')
DB.exec "CREATE TABLE mytable (testcol BYTEA)"
BINARY = 1

将二进制数据

sql = "INSERT INTO mytable (testcol) VALUES ($1)"
param = {value: binary_data, format: BINARY}
DB.exec_params(sql, [param]) {|res| res.cmd_tuples == 1 }

选择二进制数据

sql = "SELECT testcol FROM mytable LIMIT 1"
DB.exec_params(sql, [], BINARY) {|res| res.getvalue(0,0) }

分类:SQL 时间:2015-03-15 人气:28
本文关键词: SQL和PostgreSQL
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.419 (s). 10 q(s)