暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

[译文] PostgreSQL 选择不同的字节(或 Blob)

原创 Luca Ferrari 2021-08-06
704

选择不同的字节(或 Blob)

TLDR:在我看来,PostgreSQL 在处理distinctBLOB类似字段时比 Oracle 具有更舒适的行为。

我不是一个狂热的 Oracle 用户,至少不像我对 PostgreSQL 那样多。
最近几天,我发现我的一个应用程序存在问题:在BLOB向 Oracle 表中添加一,一些自动查询开始失败。一开始并不是那么简单,找出问题所在,但本质上我使用ORM是生成一个带有distinct子句的查询,而且似乎 Oracle 在涉及BLOB或一个CLOB字段。
让我们看一个例子:blobby表格由一个varchar2 description字段和一个bdata类型的字段BLOB

SQL> select distinct bdata, description from blobby;select distinct bdata, description from blobby                *ERROR at line 1:ORA-00932: inconsistent datatypes: expected - got BLOB
复制


报告的错误对我来说有点模糊:ORA-00932:不一致的数据类型:预期 - 得到 BLOB没有向我提供足够的信息来了解系统期望的类型。但是,看到BLOB最后一部分让我对问题进行了推理。
但是,一开始,我什至无法重现该问题,因为如果您不指定显式列列表,则相同的查询会起作用:

SQL> select distinct * from blobby;...6 rows selected.
复制


即使使用不同类型的强制转换,我也无法使查询工作,所以我猜当列被显式列出时,Oracle 无法处理查询。这就是问题所在:许多 ORM,包括我正在使用的 ORM,都会生成查询,其中所有列都被作为输出字段询问,因此 Oracle 拒绝运行查询。

PostgreSQL 怎么样?

我很好奇 PostgreSQL 如何处理相同的情况,假设BLOB可以翻译成一个bytea字段。

testdb=> create table blobby( pk int generated always as identity,description text, bdata bytea, primary key( pk ) );testdb=> insert into blobby( description ) select 'Record ' || v fromgenerate_series( 1, 5 ) v;INSERT 0 5testdb=> \lo_import myfile.pdflo_import 50626testdb=> update blobby set bdata = lo_get( 50626 );UPDATE 5testdb=> \o test.csvtestdb=> \aOutput format is unaligned.testdb=> \f ';'Field separator is ";".testdb=> select distinct bdata, description from blobby;-- same as select distinct * from blobby% ls -1hs test.csv23M test.csv
复制


尽管是创建和填充表的初始部分,正如您可以看到SELECT使用显式列列表或通配符的作品。

结论

我没有任何结论,我不责怪一个产品或另一个。他们只是在几乎相同的背景下表现不同。
我最喜欢 PostgreSQL 方法,它看起来更自然。而且,Oracle 的错误信息在我看来很晦涩!

文章Select Distinct Bytea (or Blob) 已由Luca Ferrari 于 2021 年 8 月 4 日发布


「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论