概述
所有的数据都是通过最小单位atom构造。q语言中大部分数据类型与传统语言类似,但是多出了date和time相关的类型,用来加速时间序列运算。下表给出了q语言和几个传统语言数据类型的对比:
下表给出了Q语言各个类型的详细信息:
1. 整型数据
- long: 8字节; 42, 42j
- short: 2字节有符号数;其后必须带后缀h; eg: -123h
- int: 4字节有符号数;其后必须带后缀i; eg: 1234567890i
2. 浮点数据
支持单精度和双精度浮点数据类型。
- float: 8字节;后缀f; 传统语言中的double; eg: 3.1415926, 1f, 1.0, 1.234e07, 1.234e-7
-
real: 4字节;后缀e; 传统语言中的float; eg: 12.34e, 1.234e7e
注:不建议使用real这个类型,因为在许多金融问题中,real的精度往往不够用 -
浮点数显示精度: q console默认显示7位小数,可以通过命令
\P
来最多显示16位小数,也可以通过\P 0
来显示完整的17位小数,但是最后一位小数不可信。q)f12:1.23456789012 q)f16:1.234567890123456 q)\P 12 q)f12 1.23456789012 q)f16 1.23456789012 q)\P 16 q)f12 1.23456789012 q)f16 1.234567890123456 q)\P 0 q)1%3 0.33333333333333331
3. Binary数据
-
boolean : 1字节; 后缀b; 没有
true
或者false
关键字,1b
代表true,0b
代表false -
byte : 使用1字节保存8位数据,前缀
0x
紧跟着2个16进制数,大小写均可。 eg:0x2A
,0x2a
-
GUID : globally unique identifier. 在时间和空间上都唯一,可以对null guid值
0Ng
使用?
来生成一个guids的列表。
eg:1?0Ng
,2?0Ng
,-2?0Ng
使用正号和负号生成guid列表的区别在于:正号使用同一个随机种子(seed), 而负号使用的种子是随机的可以通过解析一个16进制数字来构造guid:
"G"$"61f35174-90bc-a48a-d88f-e15e4a377ec8"
, 同样,可以使用命令sv
来从一个16个byte的列表构造guid:0x0 sv 16?0xff
。GUID适用的运算符仅有:
~, =, <, >, null
4. Text数据
q中共有两种text类型数据,更类似于SQL中的CHAR
和VARCHAR
。
-
char : 1字节; 对应SQL中的CHAR; 用双引号表示;特殊字符用
\
作为前缀来显示,尽管在q-console中依旧将\
显示了出来,但是实际上它就是一个单字符q)"\"" / double-quote "\"" q)"\\" / back-slash "\\" q)"\n" / newline "\n" q)"\r" / return "\r" q)"\t" / horizontal tab "\t" q)"\142" "b"
-
symbol : 前缀
` eg:
q,
`zaphod`
symbol与char一样,同样是原子数据,这意味着symbol不可拆分,symbol中的单个字符不可获取。 symbol不是string, 并且symbol数据`a
与char数据"a"
不相等。
5. 时间类型数据
-
date : 4字节,表示为yyyy.mm.dd; 其表示值为从2000.01.01开始的日期数,在之前的为负值,之后的为正值。
q)2000.01.01=0 1b
表示的累积日数可以通过强制转换得到:
q)`int$2000.02.01
-
Time :
如果毫秒级够用的话,使用
time
类型,表示为hh:mm:ss.uuu
;其表示值为从00:00的毫秒(milliseconds)数q)12:34:56.789 12:34:56.789 q)12:00:00.000=12*60*60*1000 1b
其表示值同样可以通过强制转换来获取
如果毫秒级不够用的话,使用
timespan
类型;其表示为从00:00开始的纳秒(nanoseconds)数, 表示为0Dhh:mm:ss.nnnnnnnnn
。 其中0D
是可选的。q)12:34:56.123456789 0D12:34:56.123456789 q)12:34:56.123456 / microseconds become nanos 0D12:34:56.123456000
-
Date-Time :
(已弃用的) 使用T
进行分隔:q)2000.01.01T12:00:00.000 _ q)2000.01.02T12:00:00.000=1.5 1b
可以通过
q)
date$2000.01.02T12:00:00.000`来提取日期和时间更推荐使用的类型是
timestamp
, 是date
类型和timespan
类型的连接,通过D
进行分离。其表示值为从千禧年计数的纳秒数,之前为负数,之后为正数。
同样,有如下的操作:q)2014.11.22D17:43:40.123456789 q)`long$2014.11.22D17:43:40.123456789 q)`date$2014.11.22D17:43:40.123456789 q)`timespan$2014.11.22D17:43:40.123456789
-
month : 32位带符号整型, 表示为
yyyy.mm
和一个尾符号m
, 其表示值为从千禧年计数的月份数。注意不要忘记带尾缀m
。q)2015.11m q)2001.01m=12 1b
-
minute : 32位带符号整型, 表示为
hh:mm
, 其表示值为从00:00计数的分钟数。q)12:30 q)12:00=12*60 1b
-
second : 32位带符号整型, 表示为
hh:mm:ss
, 其表示值为从00:00计数的秒数。q)23:59:59 q)23:59:59=-1+24*60*60 1b
-
构成和点操作符 :
可以通过点操作符提取日期,月份,日等q)dt:2014.01.01 q)dt.year 2014i q)dt.mm q)dt.dd q)ti:12:34:56.789 q)ti.hh 12i q)ti.mm q)ti.ss
但是更推荐使用强制转换符,因为它对所有有意义的时间提取和转换都是有效的:
q)`dd$dt 1i q)`mm$dt q)`dd$dt q)`month$dt 2014.01m
6. 算术Infinities 和 Nulls
一些特殊含义的表示:
Literal Value
0w Positive float infinity
-0w Negative float infinity
0n Null float ; NaN, or not a number
0W Positive long infinity
-0W Negative long infinity
0N Null long
注意小写的w
代表float, 大写的W
代表整数。
在q语言中,数字的除法结果总是float. 正数除以0的结果为正无穷,负数除以0的结果为负无穷。 在数学中,0除以0是未定义的,因此,0n
代表NaN
。整型无穷可以参与比较并返回正确的结果
q)42<0W
1b
q)-0W<42
1b
无穷代表实际的值:
q C Equivalent Numeric
0N MIN_INT -9223372036854775808
-0W MIN_INT+1 -9223372036854775807
0W MAX_INT +9223372036854775807
因此,整型的大小顺序为:
0N < -0W < normal integer < 0W
q)9223372036854775806+1
0W
q)-0W-1
0N
q)-0W+1
-9223372036854775806
实际上q语言没有溢出解释了如下现象:
q)0W+1
0N
q)0W+2
-0W
q)0W+3
-9223372036854775806
7. Nulls
null值一般表示的是缺失数据。在q中, null与正常的值占用同样的空间,如下总结了null的不同类型值:
type null
boolean 0b
guid 0Ng (00000000-0000-0000-0000-000000000000)
byte 0x00
short 0Nh
Int 0N
long 0Nj
real 0Ne
float 0n
char " "
sym `
timestamp 0Np
month 0Nm
date 0Nd
datetime 0Nz
timespan 0Nn
minute 0Nu
second 0Nv
time 0Nt
注意:""
不是一个null char, 而是一个char的空列表
使用null
指令而不是=
来测试一个值是不是null值,因为q语言是动态类型的,而null
指令是类型独立的。
q)null 42
0b
q)null `
1b
q)null " "
1b
q)null ""
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。