KingbaseES 基于PostgreSQL进行了大量的Oracle兼容性开发,为了能同时兼容Oracle 和 PG 的特性,增加参数进行控制。以下介绍 KingbaseES 下特有的参数 ignore_char_null_check
功能作用:KES 内部是拿 0x00 作为字符的结束符的。字符里边不允许含有0x00,如果一个字符串里边还有0x00的话,会被截断。参数默认值为 off ,也就是会检查字符串是否有 0x00 字符,这也是 PG 的行为。
1、Oracle对于ascii 0 字符处理
oracle对于ascii 为 0 的字符作为一个字符处理。
SQL> select 'a'||chr(0)||'b' from dual;
'A'
---
a b
SQL> select length('a'||chr(0)||'b') from dual;
LENGTH('A'||CHR(0)||'B')
------------------------
3
2、PG对于ascii 0 处理
testdb=# select E'\x00';
ERROR: invalid byte sequence for encoding "UTF8": 0x00
3、KingbaseES 对于ascii 0 处理
test=# set ignore_char_null_check=off;
SET
test=# select E'\x00';
ERROR: invalid byte sequence for encoding "UTF8": 0x00
test=# set ignore_char_null_check=on;
SET
test=# select E'\x00';
?column?
----------
(1 row)
test=# select 'a'||E'\x00'||'b';
?column?
----------
ab
(1 row)
总结:该参数是为迁移oracle数据而专门设置的,需要看看oracle那边,哪个字段里边有0x00,如果是clob的话就没啥问题,如果是varchar这种,就有风险。建议在迁移时打开,迁移后关闭。你可以看到,参数值为on,迁移也只是忽略这个特殊字符。