我的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>
答案 0 :(得分:2)
如果要存储无效编码数据,请使用bytea
。正如mu暗示的那样,你必须处理这样一个事实:子串和长度等现在是面向字节的,而不是面向字符的。
是一个无效编码文本的问题。 left(n)
如何知道要抓取多少个字符?索引如何确定正确的词法排序顺序?更不用说如果表格中的数据编码错误,PostgreSQL无法进行即时字符编码转换(例如client_encoding = 'latin-1'
)。
您似乎想要某种宽松或宽容的编码模式,如果数据在当前编码中无效,或者用?
或其他内容替换它,它会回退到基于字节的解释。这是一个有用的东西,但PostgreSQL不支持。