概览
参照该文里的两个表格来了解Q的数据类型。其中:
- type:类型名称
- size:该类型占用多少个字节
- char type:该类型的单字符代号,可以跟在值后面表示类型,例如1b表示boolean的true
- num type:该类型的数字代号,type命令可以用来查看一个变量的类型,以数字代号表示。数字前面带-号表示原子类型,不带-号表示是该原子类型的列表
type 0Nj -7h type (1j;2j) 7h
注意KDB 3.1以后默认类型有些变化,例如原来一个数字默认是int,3.1之后默认是long
type 0Ni -6h type 0Nj -7h type 0N -7h
浮点数
float类型的精度不少于15位小数,real类型的精度不少于6位小数。注意q控制台显示值的时候值显示7位精度的数字,例如
q)1.123456789 1.123457 q)1.123456789e 1.123457e
可以通过“\P”命令更改显示精度
q)\P 16 q)1.123456789 1.123456789 q)1.123456789e 1.123456835746765e
二进制数据
包括boolean和byte。0b是false,1b是true。byte用16进制表示,如0x2a。二进制数据可以当作数值参与计算。
文本数据
包括char和symbol。
char是单字符,使用\作特殊符号的转义符,例如"\"","\n"等。也支持反斜杠后跟数字表示ASCII,如"\142"表示”b"。
symbol以`开头。symbol与string的区别
- string是一个char列表,而symbol是不能再拆分的原子类型,它并不是由char组成,例如我们可以取得一个string的第几个字符,而symbol则没有这种做法
q)"abc"[0] "a" q)`abc[0] 'abc
`$"A symbol with `backtick"
时间数据
类型 | 格式(红色字符表示固定字符,非格式) | 转换成数字(`int$<var>) |
date | yyyy.mm.dd | 当年第几天,例如31 |
time | hh:mm:ss.uuu | 当天的毫秒数,例如45296789 |
datetime | yyyy.mm.ddThh:mm:ss.uuu | 当年第几天,时间折算成小数,例如31.5 |
month | yyyy.mmm | 当年第几月,注意它是以0开始,例如一月是0 |
minute | hh:mm | 分钟数,小时数会转换成分钟数,例如83 |
second | hh:mm:ss | 秒数,时分都会转换成秒数,例如45296 |
时间数据可以通过变量.名称的方式获取它的组成部分,例如
q)d:2014.05.27 q)d.year 2014i
可用的名称包括:year/mm/dd/hh/mm/ss/month/minute/second。不过这种方式不适用于函数参数,如
q)fmm:{[x] x.mm} q)fmm 2006.09.15 {[x] x.mm} 'x.mm
可以使用类型转换
q))fmm:{[x] `mm$x} q))fmm 2006.09.15 9i
无穷数和非数值
0+W/w+类型名(单字符)表示该类型的无穷数,0w表示float类型而0W表示int类型(kdb 3.1之前)或者long类型(kdb 3.1以后)。任何非0数除以0会得到正或者负的无穷数(float类型)。
非数值用n代替w,同样的,未指明类型时,小写表示float类型,大写表示int或者long类型。0除以0会得到非数值(float类型)。
KDB的哲学是任何合法的数学表达式都会得到一个结果而非错误。
需要注意的是,kdb底层使用bit表示无穷数,所以无穷数参与计算的时候会变成正常的数值,如:
q)0Wi - 2 2147483645 q)2i*0Wi -2i
空值
KDB里每种类型都有自己的空值
- 二进制数据没有专门的空值,0就是表示空值
- 数值类型和时间类型都有自己专门的空值
- char类型的空值是空格,""不是char型,它是char类型的空list
- symbol类型的空值是`
尽量不使用默认类型
由于kdb的默认类型在不同版本之间会产生变化,为保证自己的程序在不同版本之间的兼容性,尽量明确定义类型。