ClickHouse JSON类型存储整数转为字符串问题咨询
ClickHouse JSON类型默认存储整数为字符串是否符合预期?
这个现象完全符合ClickHouse 25.3版本中**原生JSON类型(无路径类型提示)**的默认行为。
原因在于:
- ClickHouse的
JSON类型(未指定路径和对应类型时)是一个无类型约束的动态容器,为了兼容各种异构输入数据,它会将所有非字符串类型的数值统一以字符串形式存储,不会自动保留原始的整数、浮点等数值类型。 - 当使用
toJSONString函数导出这类JSON数据时,它会直接读取存储层的字符串值进行序列化,自然无法还原出原本的整数类型,最终导出的JSON里数值还是字符串格式。
如果需要保留整数类型来解决备份问题,可以尝试两种方案:
- 定义表结构时指定类型提示:创建表时给JSON字段明确指定路径和对应数值类型,比如:
这样ClickHouse会按照指定类型解析并存储数值,后续用CREATE TABLE logs ( data JSON('$.user_id UInt64, $.visit_count Int32') ) ENGINE = MergeTree() ORDER BY tuple();toJSONString导出时就能保留整数类型。 - 对已有数据做类型转换:针对已经存储的JSON数据,先用
JSONExtractInt/JSONExtractUInt等函数提取数值并转换成对应类型,再重新序列化,比如:SELECT toJSONString({ user_id: JSONExtractUInt(data, 'user_id'), visit_count: JSONExtractInt(data, 'visit_count') }) AS formatted_json FROM logs;
内容的提问来源于stack exchange,提问作者dexian
相关产品推荐
相关产品推荐

