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

clickhouse对null值的处理

letitia1208 2022-05-07
3931

近期测试发现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,
    ENGINE = MergeTree
    PRIMARY KEY id
    ORDER BY id
    
  • 看一下录入数据的最终结果
  • 从以上结果可以看出:
    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; 查询不出结果,换成 =’'也不行 。

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

    alter table test_220507 modify column col_name Nullable(String);
    

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

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