关于数据类型的length/precision/scale

最后更新:2024-01-30 23:03:50 | 状态:未完成
对于不同的数据库,不同的数据类型这三个属性稍有区别

length:一般用来表示varchar的最大长度

precision:一般用来表示数字类型的有效位数

scale:一般用来表示数字类型的小数位数
但有些数据为中,的数字类型可能同时有这三个属性,也可能没有precision和scale
尽量不要直接读取这三个属性,如果需要读取列数据类型可以调用Column.getFullType会返回类似varchar(10), decimal(10,2)等完整类型,用getPrecisionLength()返回长度(会根据不同类型返回length或precision)
如果确实需要这三个属性,可以配合column.ignoreLength是否忽略长度,ignorePrecision,ignoreScale几个方法
如先判断是否忽略precision,如果不忽略再看有没有precision值
如果忽略precision再判断是否忽略length

注意这里的忽略长度是指创建列时,是否忽略,并不等这种类型没有长度。
长度也不一定比有效位数大,如在SQL Server中bigint类型的length=8,precision=19, scale=0;而datetime类型length=8,precision=23, scale=3
scale也并不一定需要precision,如在ORACLE中TIMESTAMP(6) WITH TIME ZONE类型length=11, precision=null, scale=6;而NUMBER类型length=22,precision与scale可以都空也可以只设置precision



关于配置优先级,由高到低

1.当前adapter中的LinkedHashMap<String, TypeMetadata.Config> typeConfigs (针对当前数据库具体数据类型,也就是*TypeMetadataAlias中定义的类型)

2.StandardTypeMetadata(通用标准数据类型)
3.当前adapter中的LinkedHashMap<TypeMetadata.CATEGORY, TypeMetadata.Config> typeCategoryConfigs(针对当前数据库数据类型大类)
4.AbstractDriverAdapter中的LinkedHashMap<TypeMetadata.CATEGORY, TypeMetadata.Config> standardCategoryConfigs(针对通用数据类型大类)


类似的配置还有AbstractMetadataAdapter用来配置取表名、列名、数据类型等元数据时的依据(在结果集的哪一列中)


最近更新 搜索 提交