数据类型

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

DECIMAL32(S)

37

3.1415926$DECIMAL32(3)

4

Decimal

(-1*10^(9-S), 1*10^(9-S))

DECIMAL64(S)

38

3.1415926$DECIMAL64(3), , 3.141P

P

8

Decimal

(-1*10^(18-S), 1*10^(18-S))

DECIMAL128(S)

39

3.1415926$DECIMAL128(3)

16

Decimal

(-1*10^(38-S), 1*10^(38-S))

说明:

1. 上表除以下类型外,都支持作为表字段:VOID, FUNCTIONDEF, HANDLE, CODE, DATASOURCE, RESOURCE, COMPRESS, DURATION。在支持的类型中,仅内存表字段支持 ANY 类型,仅 TSDB 引擎支持 BLOB 类型和 ARRAY VECTOR。

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,如果数据溢出,则溢出的数据处理为空值。

6. DOUBLE 和 FLOAT 类型精度遵循 IEEE 754 标准;该类型数据溢出时,会被处理为 NULL。

New in version 2.00.8: 新增类型 DECIMAL

7.DECIMAL32(S),DECIMAL64(S) 及 DECIMAL128(S) 中的 S 表示保留的小数位数,其中,DECIMAL32(S) 中 S 的有效范围为[0, 9],DECIMAL64(S) 中 S 的有效范围为[0, 18],DECIMAL128(S) 中 S 的有效范围为 [0,38]。DECIMAL32 底层存储使用 int32_t 类型,占用4个字节;DECIMAL64 底层存储使用 int64_t 类型,占用8个字节;DECIMAL128 底层存储使用 int128_t 类型,占用16个字节。DECIMAL32(0) 可以表示的有效整数范围为 [-999999999, 999999999], 而 4 字节整数(INT32)的范围为 [-2,147,483,648, 2,147,483,647]。因此将数值型数据强制转换为 DECIMAL32 时,若该数值的整数部分超过 DECIMAL32 的有效数值范围, 但仍属于 [-2147483648, 2147483647] 范围,可以转换成功。而将字符串强制转换成 DECIMAL32 时,会进行位数校验,若字符串长度超过有效位数,则抛出异常。

$ decimal32(1000000000, 0)
1000000000

$ decimal32(`1000000000, 0)
Convert string to DECIMAL failed: Decimal math overflow

类型检查

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

$ typestr 3P;   //此为 2.00.9.4 版本新增功能
DECIMAL64

字符串

我们可以在 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