暂无图片
暂无图片
2
暂无图片
暂无图片
1
暂无图片

clickhouse对null值的处理

原创 letitia1208 2022-05-07
7971

近期测试发现ck针对不同数据类型对null值的处理和Oracle、MySQL等有些区别,记录一下。

  • 首先创建一张测试表,主要包含数值型、字符型和日期型:
CREATE TABLE test.test_220507
(

    `id` Int8,

    `col_name` String,

    `col_Int8` Int8,

    `col_Int16` Int16,

    `col_Int32` Int32,

    `col_int64` Int64,

    `col_UInt8` UInt8,

    `col_UInt16` UInt16,

    `col_UInt32` UInt32,

    `col_UInt64` UInt64,

    `dt_Date` Date,

    `dt_DateTime` DateTime,

    `c_uuid` UUID,

    `col_decimal` Decimal(5,
 2)
)
ENGINE = MergeTree
PRIMARY KEY id
ORDER BY id
复制
  • 看一下录入数据的最终结果

image.png

  • 从以上结果可以看出:
    id=5:UIntxx几个字段,因为填入-1超出保存范围,全部自动替换成了数据类型的最大值,datetime字段填入’2022-05-07’则自动补全时分秒;
    id=6:数值型字段因为录入的是10,符合要求正常显示,col_decimal字段只能录入两位最大精度,超出范围会报错(例如录入10.3333在这里会报错);
    id=7:数值型字段插入空值,全部自动用0补全。Date字段自动补全’1970-01-01’,DateTime字段自动补全’1970-01-01 08:00:00’;
    id=8:col_name字段录入空字符串,但是因为字段属性非空,查询时不能用 is null 筛选。

  • 下面就String类型录入空值特殊说明一下:

1、select * from test_220507 t where t.col_name is null; 查询不出结果,换成 =’'也不行 。
image.png

2、ck中String类型字段将空值保存成空字符串,没办法用where条件筛选,只能修改字段属性:

alter table test_220507 modify column col_name Nullable(String);

复制

3、添加一行id=9的记录,除id字段全录入空值,对比一下col_name字段:
image.png

由此可以看出,字段调整为Nullable属性之后,原有字段空字符串不会变,再录入空值会保存为null,取数SQL也不一样:
(1)
image.png

(2)
image.png

  • 总结:通过以上测试可以看出,若是一个字段如果会录入空值,设计表结构时就要提前设置允许为空,否则录入结果可能不符合预期,也很容易埋坑。

---------------------------------------完---------------------------------

最后修改时间:2022-05-07 22:07:23
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文章被以下合辑收录

评论

墨天轮福利君
暂无图片
3年前
评论
暂无图片 0
您好,您的文章已入选墨力原创作者计划合格奖,10墨值奖励已经到账请查收! ❤️我们还会实时派发您的流量收益。
3年前
暂无图片 点赞
评论