You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ClickHouse为现有表加JSON列后查询插入报错,求原因及解决

ClickHouse JSON列ALTER操作报错原因分析

问题场景

使用ClickHouse 22.8.2(revision 54460)版本执行以下操作后出现异常:

  1. 创建包含JSON列的MergeTree表,执行desc github_json2 SETTINGS describe_extend_object_types = 1,显示该JSON列为Tuple(_dummy UInt8)
  2. 执行alter table github_json2 add column common2 JSON after common添加新JSON列,再次执行desc命令显示该列为Object('json')
  3. 后续操作触发报错:
    • 查询表时:DB::Exception: There is no physical column or subcolumn common2 in table: While executing MergeTreeInOrder. (NO_SUCH_COLUMN_IN_TABLE)
    • 插入数据时:DB::Exception: Least common type for object can be deduced only from tuples, but Object('json') given. (LOGICAL_ERROR)

问题成因

  • 新旧JSON类型存储不兼容:ClickHouse 22.8版本中,JSON类型正处于从旧的Tuple兼容格式向新的Object('json')类型过渡的阶段。最初创建的JSON列被底层映射为Tuple(_dummy UInt8),而通过ALTER新增的JSON列则使用了新的Object('json')类型,两种类型的存储逻辑完全不同,导致表的元数据和物理存储出现不匹配。
  • ALTER操作的逻辑bug:该版本中,ALTER ADD COLUMN添加JSON列时存在缺陷——元数据里标记了新列为Object('json'),但并没有在物理磁盘上创建对应的存储结构,所以查询时会提示找不到这个列;插入数据时,ClickHouse无法在旧的Tuple格式和新的Object格式之间完成类型推导,进而触发逻辑错误。
  • JSON类型的实验性限制:22.8版本的JSON类型还未完全稳定,属于半实验性特性,相关的ALTER操作、类型兼容逻辑都还存在未修复的问题,这些bug在后续的23.x及更高版本中才被逐步解决。

结论

这个问题不是操作失误导致的,核心原因是ClickHouse 22.8.2版本中JSON类型处于过渡阶段的实现缺陷,属于版本本身的bug,和该版本JSON类型的实验性状态直接相关。

内容的提问来源于stack exchange,提问作者BaoXin Lei

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 16:07:23