在我的应用程序中,我使用 C 代码在数据库中插入数据,因为我从不受信任的来源收到的字符串我已经使用PQescapeByteaConnlibpq 库对它们进行了转义。哪个工作得很好,即结果为八位字节格式字符串。看下面的例子,
输入字符串: \n\t\f\b\p\k\j\l\mestPrepared
输出字符串: \\012\\011\\014\\010pkjlmestPrepared
输出字符串被插入到数据库中。现在,我使用 JDBC 从 Java 代码中的数据库中检索该数据。如何将字符串转义回其原始值?
我想到了两种可能的方法,
我可以理解方法 1 会更有效。我已经尝试了这里列出的几乎所有功能,但没有任何效果。请帮忙!!
我在 linux 机器上使用 8.4 版的 postgres。
我希望能够生成bytea任意长度(<1Gb)的随机字段来填充测试数据。
这样做的最佳方法是什么?
我们有什么(软件):
postgresql.conf)硬件:
所以,我们必须加载到数据库 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
如何在 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]
我希望将大型 (100Mb -- 1 GB) 多通道时间序列数据导入 PostgreSQL 数据库。数据来自EDF 格式的文件,这些文件将数据分块成“记录”或“时期”,每个“记录”或“时期”通常为几秒钟。每个时期的记录将每个数据通道的信号保存为短整数的顺序数组。
我被要求将文件存储在数据库中,在最坏的情况下存储为 BLOB。鉴于此,我想研究可以让我对数据库中的数据做更多事情的选项,例如促进基于信号数据的查询。
我最初的计划是将数据存储为每个纪元记录一行。我想要权衡的是是否将实际信号数据存储为 bytea 或 smallint[](甚至 smallint[][])类型。有人可以推荐一个吗?我对存储和访问成本感兴趣。用法很可能是插入一次,偶尔读取,从不更新。如果一个更容易包装为自定义类型,以便我可以添加用于分析比较记录的函数,那就更好了。
毫无疑问,我缺乏细节,所以请随时对您希望我澄清的内容添加评论。
幸运的是,当我尝试在大长度文本列上创建唯一索引时,Erwin Brandstetter救了我。
插入率的上限是每年数百亿行。
对于我的实现,散列永远不需要离开数据库,但散列数据必须经常与外部数据进行比较才能存在。
根据我针对这些目的进行优化的有限经验,我假设散列的最佳数据类型是bytea. 替代方案当然是更长的十六进制字符串。
bytea这些哈希的最佳数据类型是否正确?
如果bytea不是最优的,什么是最优的?
我的意图应该如何实现?
澄清
我根据 Erwin Brandstetter 的建议使用文本的哈希值,以确保大文本是唯一的。我有限的理解是,原始二进制数据总是性能最好的,尤其是与字符串相比时。
只需比较哈希是否存在即可抢占唯一性违规,因此哈希很高兴永远不需要离开数据库。由于 libpqxx 令人难以置信的设计,看起来好像数据可以简单地通过准备好的语句输入并使用(decode(md5($1::text), 'hex')). 当我更熟悉bytea通过 libpqxx 3.1 插入时,我会将其移至 C++。
对于此实现,冲突是可以接受的,因为可以在不破坏系统的情况下重建数据以符合要求。
如果愉快地达到最大吞吐量,那么应该预期经济资源将可用于容纳它;因此,主要关注点始终是性能,所以如果我对 Postgres 的功能及其分区表处理这些行数的能力的理解是准确的,那么它有望在很长一段时间内成为该工作的正确工具。幸运的是,超过几秒钟的数据永远不会改变,我的理解是 Postgres 分区表可以将这些数据制成碎肉。如果没有,这将是那些好问题之一。
我目前正在处理一个包含以 bytea 格式存储的散列的表。然而,将散列转换为十六进制字符串会产生错误的字节顺序。例子:
SELECT encode(hash, 'hex') FROM mytable LIMIT 1;
Output: 1a6ee4de86143e81
Expected: 813e1486dee46e1a
Run Code Online (Sandbox Code Playgroud)
有没有办法颠倒所有条目的字节顺序?
我们有一个 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 数据库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) 我有一个可以包含相当大的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”的值)很有用,但记录 longBYTEA或TEXTvalue 不是。事实上,日志中的二进制数据以文本形式(例如 …
我在 postgresql 数据库中有一个表,有一列类型为bytea。我想使用 id 作为文件名将每个二进制条目作为文件删除。
SQL 查询会是什么样的?
bytea ×11
postgresql ×10
blob ×1
datatypes ×1
encoding ×1
export ×1
index ×1
insert ×1
log ×1
optimization ×1
performance ×1
psql ×1
random ×1
string ×1
testing ×1