标签: bytea

使用 PostgreSQL 8.4,如何在 postgres 中将 bytea 转换为文本值?

在我的应用程序中,我使用 C 代码在数据库中插入数据,因为我从不受信任的来源收到的字符串我已经使用PQescapeByteaConnlibpq 库对它们进行了转义。哪个工作得很好,即结果为八位字节格式字符串。看下面的例子,

输入字符串: \n\t\f\b\p\k\j\l\mestPrepared

输出字符串: \\012\\011\\014\\010pkjlmestPrepared

输出字符串被插入到数据库中。现在,我使用 JDBC 从 Java 代码中的数据库中检索该数据。如何将字符串转义回其原始值?

我想到了两种可能的方法,

  1. 更改数据库检索查询并将此字段传递给 postgres 的任何字符串操作函数,即可以将 bytea 转换为文本。
  2. 在Java代码中进行解码。

我可以理解方法 1 会更有效。我已经尝试了这里列出的几乎所有功能但没有任何效果。请帮忙!!

我在 linux 机器上使用 8.4 版的 postgres。

postgresql encoding postgresql-8.4 string bytea

25
推荐指数
3
解决办法
8万
查看次数

如何生成随机字节

我希望能够生成bytea任意长度(<1Gb)的随机字段来填充测试数据。

这样做的最佳方法是什么?

postgresql testing random bytea

21
推荐指数
3
解决办法
5017
查看次数

为大量 INSERTS 和 bytea 更新优化 PostgreSQL

我们有什么(软件):

  • 带有基本配置的PostrgeSQL 9.3(在 中没有变化postgresql.conf
  • 视窗 7 64 位

硬件:

  • 英特尔酷睿 i7-3770 3.9 GHz
  • 32 Gb 内存
  • WDC WD10EZRX-00L4HBATa 驱动器(1000Gb,SATA III)

所以,我们必须加载到数据库 aprox。100.000.000行与bytea列,以及更简单的500.000.000行(无 LOB)。varchar第一个表上有 2 个索引(长度为 13、19),varchar第二个表上有 2个索引(长度为 18、10)。每个表也有生成 id 的序列。

到目前为止,这些操作使用 8 个并行连接和 50 个 JDBC 批处理大小进行。下图展示了系统负载:它对postgresql进程是零负载。加载 24 小时后,我们只加载了 10.000.000 行,这是非常缓慢的结果。

在此处输入图片说明

我们寻求帮助调整PostrgreSQL配置的目的是:

1)为了超快加载这个数量的数据,它是一次性操作,所以它可以是临时配置

2) 对于生产模式,通过它们的索引对这 2 个表执行中等数量的 SELECT,无需连接和排序。

performance insert database-tuning postgresql-9.3 bytea performance-tuning

12
推荐指数
1
解决办法
4万
查看次数

如何将 bytea 列转换为文本?

如何在 PostgreSQL 中将 bytea 列转换为文本,以便我可以在 PGADMIN 中正确读取该列?

我在 PGADMIN 的查询编辑器中有以下 SQL 查询:

SELECT event_type, created_at, encode(metadata::bytea, 'escape') 
FROM public.events 
ORDER BY created_at DESC
LIMIT 100
Run Code Online (Sandbox Code Playgroud)

但是,它会生成一encoded列,其中每条记录或多或少类似于以下输出:

\203t\00000some_textd\000some_other_textd\0000
Run Code Online (Sandbox Code Playgroud)

我怎样才能摆脱这种编码,以便我只能看到文本格式的列的原始值:

some_text some_data
Run Code Online (Sandbox Code Playgroud)

我也尝试过:

SELECT event_id, event_type, created_at, decode((encode(metadata, 'escape')::text), 'escape')
FROM public.events
ORDER BY created_at DESC
LIMIT 100
Run Code Online (Sandbox Code Playgroud)

但在上面的情况下,查询返回一个decode类型的列,我只看到该列的每个记录的bytea字段。[binary data]

我还尝试了这里提到的前两个答案,但没有成功,并且无法正确翻译我的查询的最后一个答案

postgresql bytea

10
推荐指数
1
解决办法
3万
查看次数

PostgreSQL bytea 与 smallint[]

我希望将大型 (100Mb -- 1 GB) 多通道时间序列数据导入 PostgreSQL 数据库。数据来自EDF 格式的文件,这些文件将数据分块成“记录”或“时期”,每个“记录”或“时期”通常为几秒钟。每个时期的记录将每个数据通道的信号保存为短整数的顺序数组。

我被要求将文件存储在数据库中,在最坏的情况下存储为 BLOB。鉴于此,我想研究可以让我对数据库中的数据做更多事情的选项,例如促进基于信号数据的查询。

我最初的计划是将数据存储为每个纪元记录一行。我想要权衡的是是否将实际信号数据存储为 bytea 或 smallint[](甚至 smallint[][])类型。有人可以推荐一个吗?我对存储和访问成本感兴趣。用法很可能是插入一次,偶尔读取,从不更新。如果一个更容易包装为自定义类型,以便我可以添加用于分析比较记录的函数,那就更好了。

毫无疑问,我缺乏细节,所以请随时对您希望我澄清的内容添加评论。

postgresql datatypes blob bytea

9
推荐指数
1
解决办法
921
查看次数

索引大文本的最佳散列技术

幸运的是当我尝试在大长度文本列上创建唯一索引时,Erwin Brandstetter救了我

插入率的上限是每年数百亿行。

对于我的实现,散列永远不需要离开数据库,但散列数据必须经常与外部数据进行比较才能存在。

根据我针对这些目的进行优化的有限经验,我假设散列的最佳数据类型是bytea. 替代方案当然是更长的十六进制字符串。

bytea这些哈希的最佳数据类型是否正确?

如果bytea不是最优的,什么是最优的?

我的意图应该如何实现?

澄清

我根据 Erwin Brandstetter 的建议使用文本的哈希值,以确保大文本是唯一的。我有限的理解是,原始二进制数据总是性能最好的,尤其是与字符串相比时。

只需比较哈希是否存在即可抢占唯一性违规,因此哈希很高兴永远不需要离开数据库。由于 libpqxx 令人难以置信的设计,看起来好像数据可以简单地通过准备好的语句输入并使用(decode(md5($1::text), 'hex')). 当我更熟悉bytea通过 libpqxx 3.1 插入时,我会将其移至 C++。

对于此实现,冲突是可以接受的,因为可以在不破坏系统的情况下重建数据以符合要求。

如果愉快地达到最大吞吐量,那么应该预期经济资源将可用于容纳它;因此,主要关注点始终是性能,所以如果我对 Postgres 的功能及其分区表处理这些行数的能力的理解是准确的,那么它有望在很长一段时间内成为该工作的正确工具。幸运的是,超过几秒钟的数据永远不会改变,我的理解是 Postgres 分区表可以将这些数据制成碎肉。如果没有,这将是那些好问题之一。

postgresql index optimization bytea

7
推荐指数
1
解决办法
2121
查看次数

postgres bytea 字段的反向字节顺序

我目前正在处理一个包含以 bytea 格式存储的散列的表。然而,将散列转换为十六进制字符串会产生错误的字节顺序。例子:

SELECT encode(hash, 'hex') FROM mytable LIMIT 1;

Output: 1a6ee4de86143e81
Expected: 813e1486dee46e1a
Run Code Online (Sandbox Code Playgroud)

有没有办法颠倒所有条目的字节顺序?

postgresql psql bytea

7
推荐指数
1
解决办法
3098
查看次数

Postgresql 和 UTF8 到 Latin1 的转换?

我们有一个 Postgresql 数据库,其中数据在 Latin1 中。显然有人将一些 UTF8 编码的数据加载到其中,因为当我从某些列中选择数据时,我得到如下内容:

SELECT symptoms from client
- -
"huvudvärke"
- -
Run Code Online (Sandbox Code Playgroud)

其中“ä”应该是“ä”。我可以用替换来处理它,即:

UPDATE client SET symptoms=replace(symptoms, 'ä', 'ä');
Run Code Online (Sandbox Code Playgroud)

我尝试了几个我找到的解决方案,比如使用convert和 ,convert_to但这使数据看起来像"huvudv\303\244rke".

我的问题有现有的解决方案吗?

编辑:

SELECT symptoms, symptoms::bytea from client
- -
"huvudvärke";"huvudv\303\203\302\244rke" 
- -
Run Code Online (Sandbox Code Playgroud)

在上面的 UPDATE 之后,查询症状::bytea 输出:

SELECT symptoms, symptoms::bytea from client
- -
"huvudvärke";"huvudv\303\244rke" 
- -
Run Code Online (Sandbox Code Playgroud)

编辑2:

select version();
"PostgreSQL 9.2.9, compiled by Visual C++ build 1600, 64-bit"

show client_encoding; --I'm using pgAdmin III 1.18.1
"UNICODE"

show server_encoding;
"UTF8" …
Run Code Online (Sandbox Code Playgroud)

postgresql bytea

6
推荐指数
1
解决办法
4万
查看次数

从 bytea 列导出图像文件

我正在尝试从 PostgreSQL 数据库users_data_circulation中导出图像文件。该表有一个photo(bytea) 列。

我的命令:

copy (select encode(photo,'hex') from users_data_circulation limit 1)
    TO '/tmp/imagetest.hext';
Run Code Online (Sandbox Code Playgroud)

在操作系统中:

$> xxd -p -r /tmp/imagetest.hex > /tmp/imagetest.jpg
$> file /tmp/imagetest.jpg
/tmp/imagetest.jpg: ASCII TEXT
Run Code Online (Sandbox Code Playgroud)

我无法打开jpg文件。我怎样才能把这个文件转换成jpg?

devinim@devinimpostgresql:~$ hexdump -C /tmp/image.hex | more
00000000  5c 5c 33 37 37 5c 5c 33  33 30 5c 5c 33 37 37 5c  |\\377\\330\\377\|
00000010  5c 33 34 30 5c 5c 30 30  30 10 4a 46 49 46 5c 5c  |\340\\000.JFIF\\|
00000020  30 30 …
Run Code Online (Sandbox Code Playgroud)

postgresql export postgresql-9.3 bytea

6
推荐指数
1
解决办法
1万
查看次数

限制 PostgreSQL 日志记录

我有一个可以包含相当大的BYTEA值的表(同样适用于大TEXT值)。它看起来像这样:

CREATE TABLE testtable (
    id SERIAL PRIMARY KEY,
    name TEXT UNIQUE NOT NULL, -- This is just an example: this could be the PK
    value BYTEA -- This could be TEXT
);
Run Code Online (Sandbox Code Playgroud)

如果使用此表的应用程序尝试使用相同的 插入两行name,我会在日志中收到此错误(当然,这是预期错误):

CREATE TABLE testtable (
    id SERIAL PRIMARY KEY,
    name TEXT UNIQUE NOT NULL, -- This is just an example: this could be the PK
    value BYTEA -- This could be TEXT
);
Run Code Online (Sandbox Code Playgroud)

虽然记录错误以及记录语句(在此特定上下文中可能还有“name”的值)很有用,但记录 longBYTEATEXTvalue 不是。事实上,日志中的二进制数据以文本形式(例如 …

postgresql log bytea

5
推荐指数
1
解决办法
603
查看次数

将表中的所有二进制列转储为文件

我在 postgresql 数据库中有一个表,有一列类型为bytea。我想使用 id 作为文件名将每个二进制条目作为文件删除。

SQL 查询会是什么样的?

postgresql bytea

4
推荐指数
1
解决办法
2676
查看次数