【问题标题】:bytea in postgres not correctly escaped?postgres 中的 bytea 未正确转义?
【发布时间】:2014-07-10 09:00:44
【问题描述】:

我在将触发器中的 bytea 数据从一个表复制到另一个表时遇到问题。

原始查询如下所示:

INSERT INTO "mytable" ("dataid","data")
VALUES 
(123456,'\x3008d1a10a000000050000000000000000000000fb27000009090504010804060a08020b020c040000000000000000000000000001000000'::bytea);

在“插入前”触发器中,尝试将此值插入另一个表时出现语法错误。原因是触发器内部的值 NEW.data 已经转义,看起来像

0\010\321\241\012\000\000\000\005\000\000\000\000\000\000\000\000\000\000\000\373\'000\000\011\011\005\004\001\010\004\006\012\010\002\013\002\014\004\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000

有没有办法检索 NEW.dataid 实际值(在类型转换之前或作为字符串)?

附言我无法在生产数据库上更改原始查询或将 bytea_output 转换或设置为十六进制

触发功能码:

BEGIN 
PERFORM dblink('logsyellow', '
    INSERT INTO datastorage(dataid,data)    
    VALUES(' || new.dataid || ','||new.data||') 
');
RETURN new;
END;

我得到的错误:

PL/pgSQL function fn_replicate_data() line 4 at PERFORM
2014-07-08 13:24:35 GMT OPERATOR:  INSERT INTO mytable ( dataid, data ) VALUES ( 123456, '\x3008d1a10a000000050000000000000000000000fb27000009090504010804060a08020b020c040000000000000000000000000001000000'::bytea );
2014-07-08 13:24:35 GMT ERROR:  syntax error (at near "\")
2014-07-08 13:24:35 GMT CONTEXT:  Error occurred on dblink connection named "unnamed": could not execute command.
        SQL-operator: "SELECT DBLINK_EXEC('logsyellow','INSERT INTO datastorage(dataid,data)        VALUES('||new.dataid||','''||new.data||''') ')"

【问题讨论】:

  • 没什么特别的,因为触发器中NEW 中的 bytea 列实际上是没有转义。请显示代码和错误消息或可重现的测试用例,让您有不同的想法。
  • 嗨丹尼尔,刚刚在上面添加了功能代码和错误。我认为它已经转义的原因,因为“引发通知”+ sql 查询显示 INSERT INTO datastorage (dataid, data) VALUES(123456,0\010\321\241\012\000\000 \000\005\000\000\000\000\000\000\000\000\000\000\000\373\'000\000\011\011\005\004\001\010\004\006\
  • @Natalie 它作为格式化的一部分被转义为字符串以供显示。
  • @Craig 它在构建 dblink 查询或之前的阶段被转义,否则我不会收到语法错误。原始查询是正确的,不会产生错误。

标签: postgresql bytea


【解决方案1】:

终于找到解决办法了..谢谢大家)

PERFORM dblink('logsyellow','INSERT INTO datastorage(dataid,data)   VALUES(' || new.dataid || ','||quote_literal(new.data)||') ')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-08
    • 1970-01-01
    相关资源
    最近更新 更多