近期测试发现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
- 看一下录入数据的最终结果

-
从以上结果可以看出:
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也不一样:
(1)

(2)

- 总结:通过以上测试可以看出,若是一个字段如果会录入空值,设计表结构时就要提前设置允许为空,否则录入结果可能不符合预期,也很容易埋坑。
---------------------------------------完---------------------------------
最后修改时间:2022-05-07 22:07:23
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




