近期测试发现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也不一样: