是否可以在postgres文本列中存储无效的UTF-8字节序列?

时间:2017-08-06 16:10:22

标签: postgresql unicode utf-8 character-encoding

我的postgres数据库的编码是UTF-8。在某个表中,我有一个text列,我想在其中插入一些数据。现在,数据主要是有效的UTF-8,但是有很多无效字节序列的实例我 想要删除或替换。我的问题是,有没有办法将数据插入text列而不删除或替换其无效的字节序列?

这是一个简单的例子,由psql提供的shell(bash)命令行执行:

psql main postgres <<<"create table t1 (a text); insert into t1 (a) values (E'a\xC0b');";
## CREATE TABLE
## ERROR:  invalid byte sequence for encoding "UTF8": 0xc0 0x62

我知道这可能是一个很长的镜头,但有没有办法禁用postgres对插入文本的验证,也许是临时的?我不知道postgres如何使text列数据中的某些字节序列碰巧对数据库的配置字符编码无效。

如果无法做到这一点,我想唯一的办法就是使用bytea数据类型将数据存储为直接二进制数据,但请告诉我是否有更好的解决方案。< / p>

1 个答案:

答案 0 :(得分:2)

如果要存储无效编码数据,请使用bytea。正如mu暗示的那样,你必须处理这样一个事实:子串和长度等现在是面向字节的,而不是面向字符的。

是一个无效编码文本的问题。 left(n)如何知道要抓取多少个字符?索引如何确定正确的词法排序顺序?更不用说如果表格中的数据编码错误,PostgreSQL无法进行即时字符编码转换(例如client_encoding = 'latin-1')。

您似乎想要某种宽松或宽容的编码模式,如果数据在当前编码中无效,或者用?或其他内容替换它,它会回退到基于字节的解释。这是一个有用的东西,但PostgreSQL不支持。