【问题标题】: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(字节数组)类型的列来存储二进制数据。