KES copy命令参数FORCE_NOT_NULL与FORCE_NULL
关键字:
KingbaseES、copy、FORCE_NOT_NULL、FORCE_NULL、人大金仓、KingbaseES
一、\pset null
设置要用来替代空值被打印的字符串。空值默认什么也不打印,容易与空字符串弄错。
test=# create table pset_test(a TEXT);
CREATE TABLE
test=# insert into pset_test values (null);
INSERT 0 1
test=# insert into pset_test values ('');
INSERT 0 1
二、GUC参数ora_input_emptystr_isnull
将空串转为NULL。默认为on
BUG2023080800441 copy插入空字符串和null的问题
1、编辑a.txt文件,其中内容如下:
t@|@e
@|@
@|@111
正常结果:
异常结果:没有查询到任何数据
问题分析:
GUC参数ora_input_emptystr_isnull开启时,在语法分析时将空字符串转换为了NULL,参数关闭时空串不进行转换。
但是在copy时因为没有经过语法分析导致未能将空字符串转换为了NULL,因此错误将数据写入,
解决方案:
在copy从文件中解析出空字符串时,判断GUC参数ora_input_emptystr_isnull是否开启,当开启时需要将字符串类型的数据转换为NULL
补充场景:查询空串
在ora_input_emptystr_isnull关闭的时候,没有经过转换,空串还是空串,此时使用where语句查询是能够查询到空串的。
但是在ora_input_emptystr_isnull开启的时候,空串被转换成了空值null,但是在oracle中null的查询只能使用is null或者is not null查询。查询语句在经过了转换变成了where a=null,这种情况下是无法查询到空值null,因此显示的就是0条记录。
三、copy命令参数
COPY forcetest (a, b, c, d) FROM STDIN WITH (FORMAT csv, FORCE_NOT_NULL(c,d), FORCE_NULL(c,d));
1)STDIN
指定输入来自客户端应用。
2)CSV 格式
CSV 格式没有标准方式来区分 NULL 值和空字符串。KingbaseES的 COPY 用引用来处理这种区分工作。 NULL 被按照 NULL 参数字符串输出并且不会被引用,而匹配 NULL 参数字符串的非 NULL 值会被加上引用。
例如,使用默认设置时, NULL 被写作一个未被引用的空字符串,而一个空字符串数据值会被写成带双引号( "" )。
3)FORCE_NOT_NULL
不要把指定列的值与空值串匹配。在空值串就是空串的默认情况下,这意味着空串将被读作长度为零的字符串而不是空值(即使它们没有被引用)。只有在 COPY FROM 中使用 CSV 格式时才允许这个选项。
4)FORCE_NULL
将指定列的值与空值串匹配(即使它已经被加上引号),并且在找到匹配时将该值设置为 NULL 。在空值串就是空串的默认情况下,这会把一个被引用的空串转换为 NULL。只有在 COPY FROM 中使用 CSV 格式时才允许这个选项。
5)FORCE_NULL & FORCE_NOT_NULL
FORCE_NULL 和 FORCE_NOT_NULL 可以被同时用在同一列上。这会导致把已被引用的空值串转换为空值并且把未引用的空值串转换为空串。
(图中结果为ora_input_emptystr_isnull关闭时的结果)