数据类型

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

[1677.09.21T00:12:43.145224193, 2262.04.11T23:47:16.854775807]

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。

类型检查

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 31 - 1 。x+1 的结果超出 INT 类型的上限,因此 x+1 的结果为 NULL。

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