Oracle无精度/刻度Number类型对应ClickHouse的最佳数据类型选型
Oracle无精度刻度NUMBER对应ClickHouse的最佳数据类型
报错原因分析
你遇到的报错是因为Decimal64(18)的取值范围是**-10^18 < 值 < 10^18**,而待插入的1200000000000000000.0刚好超出这个范围,触发了数值溢出检查。
Oracle NUMBER(无精度刻度)的特性
Oracle中未指定精度和刻度的NUMBER类型,支持最大38位有效数字,数值范围覆盖10^-130到9.99...9×10^125(共38个9),可存储任意整数、小数类型的数值。
ClickHouse最佳对应类型推荐
根据字段存储的数值类型,选择以下对应类型:
- 整数类型字段(如ID、LOTNUMBER):
- 优先使用
Decimal128(38):完全匹配Oracle NUMBER的38位精度,能容纳所有可能的整数值,避免溢出。 - 若确认数值范围小于
1.8×10^19,可选择UInt64或Int64以获得更好的查询性能,但需确保不会超出类型范围。
- 优先使用
- 小数类型字段(如LOTPRICE):
- 使用
Decimal128(38, s),其中s根据业务实际需要的小数位数设置(例如Decimal128(38, 18)可覆盖绝大多数小数场景)。Decimal128的38位精度足够容纳Oracle NUMBER存储的所有小数数值。
- 使用
针对你当前的报错,只需将Decimal64(18)替换为Decimal128(18),即可容纳1200000000000000000.0这类超出Decimal64范围的数值。
内容的提问来源于stack exchange,提问作者Aleksey N Yakushev
相关产品推荐
相关产品推荐

