为何Kdb+的Meta对以字符串开头的混合类型列返回错误类型?
Kdb+中meta函数对混合类型列的类型判定差异解析
在Kdb+里,meta函数处理混合类型列时的表现差异,核心由Kdb+的隐式类型转换规则决定:
- 当列以字符串(char数组)开头、后续混入数值类型时,数值会被自动强制转为字符形式,整列最终统一为char数组类型,因此
meta标记t="C"。 - 当列以symbol、int、float等类型开头、混入其他无法隐式转换为该类型的值时,列会成为混合类型,
meta会显示空类型(表示无统一类型)。
示例验证
q)meta ([]col1:(`dwadw;`dawdawd);col2:123 344f) // 纯symbol列,meta返回t="s" c | t f a ----| ----- col1| s col2| f
q)meta ([]col1:(`dwadw;123i);col2:123 344f) // symbol与int混合,无统一类型,meta返回空 c | t f a ----| ----- col1| col2| f
q)meta ([]col1:("dwad";123i);col2:123 344f) // 字符串开头混入int,int被转成char数组,meta返回t="C" c | t f a ----| ----- col1| C col2| f
深层原因
Kdb+中,字符串本质是char数组("dwad"等价于'd','w','a','d')。当数值类型(如123i)与char数组放在同一列时,会触发隐式转换:数值被转为对应的字符序列(123i→"123"),整列最终成为统一的char数组类型,因此meta识别为t="C"。
而symbol、int、float之间不存在这种自动统一的隐式转换逻辑,混合后列的类型为0h(通用列表,即混合类型),meta就会显示空类型。
可以通过type函数直接验证类型:
q)type ("dwad";123i) // 返回10h,对应char数组类型(t="C") 10h q)type (`dwadw;123i) // 返回0h,对应混合类型 0h
内容的提问来源于stack exchange,提问作者Alex R.
相关产品推荐
相关产品推荐

