数据类型
DolphinDB 支持以下数据类型:
名字 |
ID |
举例 |
数据类型符号 |
字节数 |
分类 |
范围 |
---|---|---|---|---|---|---|
VOID |
0 |
NULL |
1 |
Void |
||
BOOL |
1 |
1b, 0b, true, false |
b |
1 |
Logical |
0~1 |
CHAR |
2 |
‘a’, 97c |
c |
1 |
Integral |
-2 7 +1~2 7 -1 |
SHORT |
3 |
122h |
h |
2 |
Integral |
-2 15 +1~2 15 -1 |
INT |
4 |
21 |
i |
4 |
Integral |
-2 31 +1~2 31 -1 |
LONG |
5 |
22l |
l |
8 |
Integral |
-2 63 +1~2 63 -1 |
DATE |
6 |
2013.06.13 |
d |
4 |
Temporal |
|
MONTH |
7 |
2012.06M |
M |
4 |
Temporal |
|
TIME |
8 |
13:30:10.008 |
t |
4 |
Temporal |
|
MINUTE |
9 |
13:30m |
m |
4 |
Temporal |
|
SECOND |
10 |
13:30:10 |
s |
4 |
Temporal |
|
DATETIME |
11 |
2012.06.13 13:30:10 or 2012.06.13T13:30:10 |
D |
4 |
Temporal |
[1901.12.13T20:45:53, 2038.01.19T03:14:07] |
TIMESTAMP |
12 |
2012.06.13 13:30:10.008 or 2012.06.13T13:30:10.008 |
T |
8 |
Temporal |
|
NANOTIME |
13 |
13:30:10.008007006 |
n |
8 |
Temporal |
|
NANOTIMESTAMP |
14 |
2012.06.13 13:30:10.008007006 or 2012.06.13T13:30:10.008007006 |
N |
8 |
Temporal |
|
FLOAT |
15 |
2.1f |
f |
4 |
Floating |
有效位数: 06~09 位 |
DOUBLE |
16 |
2.1 |
F |
8 |
Floating |
有效位数: 15~17 位 |
SYMBOL |
17 |
S |
4 |
Literal |
||
STRING |
18 |
“Hello” or ‘Hello’ or `Hello |
W |
不超过 65,535 |
Literal |
|
UUID |
19 |
5d212a78-cc48-e3b1-4235-b4d91473ee87 |
16 |
Literal |
||
FUNCTIONDEF |
20 |
def f1(a,b) {return a+b;} |
System |
|||
HANDLE |
21 |
file handle, socket handle, and db handle |
System |
|||
CODE |
22 |
<1+2> |
System |
|||
DATASOURCE |
23 |
System |
||||
RESOURCE |
24 |
System |
||||
ANY |
25 |
(1,2,3) |
Mixed |
|||
COMPRESS |
26 |
1 |
Integral |
-2 7 +1~2 7 -1 |
||
ANY DICTIONARY |
27 |
{a:1,b:2} |
Mixed |
|||
DATEHOUR |
28 |
2012.06.13T13 |
4 |
Temporal |
||
IPADDR |
30 |
192.168.1.13 |
16 |
Literal |
||
INT128 |
31 |
e1671797c52e15f763380b45e841ec32 |
16 |
Integral |
-2 127 +1~2 127 -1 |
|
BLOB |
32 |
不超过 4,194,304 |
Literal |
|||
COMPLEX |
34 |
2.3+4.0i |
16 |
|||
POINT |
35 |
(117.60972, 24.118418) |
16 |
|||
DURATION |
36 |
1s, 3M, 5y, 200ms |
4 |
System |
New in version 1.30.3: 新增类型 COMPLEX 和 POINT
New in version 1.30.7: 新增类型 DURATION
New in version 1.30.1: 新增类型 BLOB
说明:
1. 上表除以下类型外,都支持作为表字段:VOID, FUNCTIONDEF, HANDLE, CODE, DATASOURCE, RESOURCE, COMPRESS, BLOB, DURATION。在支持的类型中,仅内存表字段支持 ANY 类型。
2. SYMBOL 是特殊的字符串类型。某个表字段定义为 SYMBOL 类型时,必须保证该字段的不同取值小于2097152(2^21)个,否则会报错 “One symbase’s size can’t exceed 2097152”。
3. ANY DICTIONARY 是 DolphinDB 中表示 JSON 的数据类型。
4. COMPRESS 类型目前只能通过 compress 函数生成。
5. DURATION 类型可以通过 duration 函数生成或直接使用整数数字加以下时间单位(区分大小写): y, M, w, d, B, H, m, s, ms, us, ns。DURATION 数据的范围为 -2 31 +1~2 31 -1,如果数据溢出,则溢出的数据处理为空值。 DURATION 类型表示一个时间区间,可用于以下函数中:bar, wj(pwj), interval, temporalAdd, dailyAlignedBar。
6. DOUBLE 和 FLOAT 类型精度遵循 IEEE 754 标准;该类型数据溢出时,会被处理为 NULL。
类型检查
typestr 和 type 这两个函数用于检查数据类型。typestr 返回的是数据类型的名称(字符串常量);type 返回的是数据类型 ID(整数)。
$ typestr 3l;
LONG
$ type 3l;
5
$ x=3;
$ if(type(x) == INT){y=10};
$ y;
10
数据范围
整型的数据范围在上面表格中已经列出。对于整数类型的数据,DolphinDB 使用允许最小值-1来表示其相应的NULL值。例如,-128c 是一个 NULL 字符。对于 NULL 值,请参见 第6章:NULL值。
$ x=-128c;
$ x;
00c
$ typestr x;
CHAR
数据类型符号
数据类型符号用于声明常量的数据类型。在下面的第一个例子中,没有为3指定数据类型符号。在这种情况,3被默认作为整数存储在内存中。如果要保存为浮点数,则应声明为 3f(float) 或 3F(double)。
$ typestr 3;
INT
$ typestr 3f;
FLOAT
$ typestr 3F;
DOUBLE
$ typestr 3l;
LONG
$ typestr 3h;
SHORT
$ typestr 3c;
CHAR
$ typestr 3b;
BOOL
字符串
我们可以在 DolphinDB 中把字符串保存为 SYMBOL 类型数据。一个 SYMBOL 类型数据被 DolphinDB 系统内部存储为一个整数,因此数据排序和比较更有效率。因此,使用 SYMBOL 类型有可能提高系统性能,同时也可节省存储空间。但是,将字符串映射到整数(hash)需要时间,哈希表也会占用内存。
以下规则可以帮助您决定是否使用 SYMBOL 类型:
如果字符串数据较少重复,应当避免使用 SYMBOL 类型。
如果字符串数据不会被排序、搜索或比较,应当避免使用 SYMBOL 类型。
这里举两个例子:
股票交易数据中的股票代码应该使用 SYMBOL 类型,因为股票代码的数量基本是固定的,在数据中重复极多;另外,股票代码经常被搜索和比较。
描述性字段不应该使用 SYMBOL 类型,因为描述性字段很少重复,而且很少被搜索、排序或比较。
例1:排序比较:同样排序300万条记录,排序 SYMBOL 向量比 STRING 快40倍。
$ n=3000000
$ strs=array(STRING,0,n)
$ strs.append!(rand(`IBM`C`MS`GOOG, n))
$ timer sort strs;
Time elapsed: 482.027 ms
$ n=3000000
$ syms=array(SYMBOL,0,n)
$ syms.append!(rand(`IBM`C`MS`GOOG, n))
$ timer sort syms;
Time elapsed: 12.001 ms
例2:布尔运算比较:同样是300万条记录的运算,SYMBOL 向量几乎是 STRING 向量的15倍。
$ timer(100){strs>`C};
Time elapsed: 4661.26 ms
$ timer(100){syms>`C};
Time elapsed: 322.655 ms
SYMBOL类型向量的创建
(1) 使用函数 array 来创建。
$ syms=array(SYMBOL, 0, 100);
// 创建长度为100的空符号数组;
$ typestr syms;
FAST SYMBOL VECTOR
$ syms.append!(`IBM`C`MS);
$ syms;
["IBM","C","MS"]
(2) 通过类型转换
$ syms=`IBM`C`MS;
$ typestr syms;
STRING VECTOR
// 转换为符号向量;
$ sym=syms$SYMBOL;
$ typestr sym;
FAST SYMBOL VECTOR
$ typestr syms;
STRING VECTOR
(3) 使用随机函数 rand。
$ syms=`IBM`C`MS;
$ symRand=rand(syms, 10);
//生成一个随机的 SYMBOL 类型向量
$ symRand;
["IBM","IBM","IBM","MS","C","C","MS","IBM","C","MS"]
$ typestr symRand;
FAST SYMBOL VECTOR
请注意,在上面的例子中,当 rand 函数的输入是一个字符串向量时,它会生成一个 SYMBOL 类型的向量。rand 函数不会更改任何其他的输入数据类型。我们设计这个函数时有意做出这个例外,这是因为当用户基于字符串向量生成随机向量时,在大多数情况下,他们希望使用 SYMBOL 类型向量。
整数溢出
当运算的结果超出了运算中调用的变量的数据类型的范围时,就会出现溢出。在 DolphinDB 中,整数溢出的结果为 NULL。
下例中,变量 x 的数据类型为 INT,它被赋予 INT 类型允许的最大值,为2 31 - 1 。x+1 的结果超出 INT 类型的上限,因此 x+1 的结果为 NULL。
$ x=(pow(2,31)-1)$INT;
$ x+1;
00i