数据类型

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

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

DOUBLE

16

2.1

F

8

Floating

SYMBOL

17

S

4

Literal

STRING

18

“Hello” or ‘Hello’ or `Hello

W

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

Literal

COMPLEX

34

16

POINT

35

16

DURATION

36

1s, 3M, 5y, 200ms

4

System

说明:

1. SYMBOL是特殊的字符串类型。

2. ANY DICTIONARY是DolphinDB中表示JSON的数据类型。

3. DATEHOUR类型目前只能通过 datehour 函数生成。

4. DURATION类型可以通过 duration 函数生成或直接使用整数数字加以下时间单位: y, M, w, d, H, m, s, ms, us, ns。DURATION值的范围为4字节(-2 31 +1~2 31 -1),如果数据溢出,则溢出的数据处理为空值。

5. DOUBLE和FLOAT类型数据溢出时,会被处理为NULL。

类型检查

typestrtype 这两个函数用于检查数据类型。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 32 - 1 。x+1 的结果超出INT类型的上限,因此 x+1 的结果为NULL。

$ x=(pow(2,31)-1)$INT;
$ x+1;
00i