Q for Mortals2笔记 -- 原子数据类型

概览

参照该文里的两个表格来了解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 
当symbol包含有`或者空格时,需要使用sttring然后转换类型,例如
`$"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的默认类型在不同版本之间会产生变化,为保证自己的程序在不同版本之间的兼容性,尽量明确定义类型。

 

你可能感兴趣的:(数据类型)