【问题标题】:Postgres column encrypt error - invalid byte sequence for encoding "UTF8": 0xa3Postgres 列加密错误 - 用于编码“UTF8”的无效字节序列:0xa3
【发布时间】:2016-11-28 08:05:36
【问题描述】:

我正在尝试使用我自己的算法加密 Postgres 表列。我正在从文件中读取 rsa 密钥并使用算法加密数据。 我的列类型是 bytea。

当我尝试插入加密数据时,Postgres 给出以下错误:

pg_query(): 查询失败: ERROR: invalid byte sequence for encoding "UTF8": 0xa3

我尝试了一些在互联网上找到的设置编码的选项,但没有奏效。

我不知道是什么导致了这个错误。

【问题讨论】:

    标签: postgresql encryption utf-8


    【解决方案1】:

    您的代码的显着部分由以下几行组成:

    $ec = SaferCrypto::encrypt($c, $k);
    

    所以$ec此时可能包含二进制文件。 所以其余的都是错误的:

    $query = "INSERT into enc_test values('$ec')";
    $result = pg_query($query) or die('Query failed: ' . pg_last_error());
    

    因为您试图直接在查询文本中传递二进制内容。该值必须以文本表示形式编码,才能作为文字注入到查询的 values 子句中。

    这应该通过pg_escape_bytea() 函数来完成。

    【讨论】:

      【解决方案2】:

      问题是您试图将二进制数据存储在字符串 (text, character varying, ...) 列中。

      PostgreSQL 拒绝与参数client_encoding 设置的编码不匹配的数据。如果你研究RFC 3629,你会发现UTF-8中没有一个字符可以以0xa3(二进制10100011)开头。

      解决方案是使用bytea(字节数组)类型的列来存储二进制数据。

      【讨论】:

      • 能否展示完整的插入语句和表定义?
      猜你喜欢
      • 2019-04-09
      • 2016-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多