华为gauss数据库常见的13种数据类型介绍

这里我总结了华为高斯数据库的13种常见类型,除了大家都很熟悉的时间日期、字符串、数字类型等,还有二进制类型、文本搜索类型、HLL类型、JSON类型等。

a. 时间和日期类型

--我们现在创建一个test_date表格,里面有设置8种不同的时间日期格式

--往表格中添加不同的时间数据

 e2265bcf762fe8ff2e03e2c0f1d57a07.png

--这里可以看到时间有很多种不同的类型:

date 没有时区的年月日时分秒

time without time zone 没有时区的时分秒

time with time zone 有时区信息的时分秒

timestamp without time zone 没有时区的年月日时分秒

timestamp with time zone 有时区的年月日时分秒

smalldatetime 会将秒数四舍五入的时间(大于等于30秒时,分钟+1秒数清零;小于等于29秒时,秒数清零)

interval day to second(4) 时间间隔,second后面是秒数的精度,范围是0~6,据说这个类型是为了适配oracle数据库,但是并没有实现什么具体的功能

reltime 相对时间间隔,以30天为单位划分一个月来输出时间,例如如果输入'60',则会显示 2 mons;输入 '-100',则会显示 -3 mons -10 days

b. 字符串类型

varchar 不定长字符串,最大长度10485760

char 定长字符串,最大长度10485760

text 不定长字符串,最大长度1073733621

c. 数字类型

tinyint 微整数,0~255

smallint 小整数,-32768~32767

int 整数类型,-2147483648~2147483647(常用类型)

bigint 大整数,-9223372036854775808~9223372036854775807

float 浮点型小数类型,有小数时整数和小数一共可以保存15位长度,超过15位时小数不显示,截取的部分进行数字的四舍五入;

decimal和number 两个类型是一样的没有区别,都是自定义数字类型,整数部分的范围是1~1000,小数精度的范围是0~1000,未指定精度的情况下,小数点前最大131072位,小数点后最大16383位;

money 货币金额类型,在显示的时候前面会有货币符号展示出来。money类型的数据范围是:-92233720368547758.08~92233720368547758.07

 e14098c6ce21ca7e29d9f62a85950092.png

money类型的数字只能转换成decimal和number,转换其它类型会报错。

9958842f0ecfd87d928838926788960c.png

d. 二进制数据类型

blob 二进制大对象(列存不支持)

raw 变长的十六进制数据(列存不支持)

bytea 变长的二进制字符串

三种类型的存储空间都是最大支持1G~8203字节

--准备一个有三种不同类型的表格,并且添加数据

2e18d9b24ec75995f29a725581573a23.png

这里要注意的就是blob这种二进制大对象的数据添加方式:

1. 要先用 empty_blob() 往blob字段中插入空值

2. 然后使用for update对这一行数据进行上锁

3. 根据id列等,对这个数据字段进行update更新,写入二进制的字符数据

e6b36af8ad607e487728d4808615c6a8.png

e. 序列类型

smallserial 二字节序列整型,1~32767

serial 四字节序列整型,1~2147483647

bigserial 八字节序列整型,1~9223372036854775807

序列类型并不是真正意义上的数据类型,只是为了在表中设置唯一标识。因此,创建一个整数字段,并且把它的缺省数值设置为从序列发生器读取的字段内容。

我们给这个字段设定一个 NOT NULL约束以确保 NULL 不会被插入,也可以附加一个 UNIQUE 或 PRIMARY KEY 约束避免意外插入重复的数值,但这个不是强制的。

目前只支持在创建表的时候指定 SERIAL 列,不可以在已有的表中增加 SERIAL 列,也不可以将表中存在的列类型转化为SERIAL。

--创建一个有serial类型的表格

--往表格中添加数据,serial类型的字段会保持数字的自增,比较像mysql里面的auto_increment属性或者oracle里面的sequence序列号

f. 布尔类型

boolean 就是真和假两个内容,在数据库里面会用t和f来表示真假。

“真”值的有效文本值是:TRUE、't'、'true'、'y'、'yes'、'1';

“假”值的有效文本值是:FALSE、 'f'、 'false'、 'n'、 'no'、'0';

使用 TRUE 和 FALSE 是比较规范的用法,是数据库sql语句的通用写法。

 72a48f77b16c5400d0d2171bf1607590.png

g. 网络地址类型

专门存储ipv4,ipv6和MAC地址的信息

cidr 存储IPv4 或 IPv6 网络

inet 存储IPv4 或 IPv6的主机和网络,可以一起存储子网掩码

macaddr 存储MAC地址的数据

用网络地址数据存储地址,可以在存储的时候对输入的错误进行检查,并且后面有一些可以直接支持网络类型的特殊操作和功能等。

--创建一个有网络类型的表格

--往表格中添加三种不同的网络地址数据

h. 位串类型

用来存储位掩码,位掩码就是用一串0和1的二进制来表示实际的某个内容,例如我有4个不同的权限,每个权限有就是1没有就是0,那么这个用户有哪些权限呢,我们就可以用0011或者1110来表示了。

bit(n) 定长位串类型,bit 类型的数据必须准确匹配长度 n,如果存储短或者长的数据都会报错,没有长度的 bit 等于 bit(1)

bit varying(n) 不定长位串类型,bit varying 类型的数据是最长为 n的变长类型,超过 n 的数据会被拒绝,没有长度的 bit varying 表示没有长度限制

--创建一个位串类型的表格,并且添加数据

 a0dd2f4e30c06b1390252633985fb213.png

i. 文本搜索类型

tsvector tsvector类型表示一个检索单元,tsvector的值是唯一分词的分类列表,把一句话的词格式化为不同的词条,在进行分词处理的时候tsvector会自动去掉分词中重复的词条,按照一定的顺序录入,to_tsvector函数通常用于解析和标准化文档字符串;

tsquery tsquery类型表示一个检索条件,存储用于检索的词汇,并且使用布尔操作

符&(AND),|(OR)和!(NOT)来组合他们,括号用来强调操作符的分组。to_tsquery函数及plainto_tsquery函数会将单词转换为tsquery类型前进行规范化处理。

通过 tsvector 把一个字符串按照空格进行分词,分词的顺序是按照长短和字母排序的:

4862d743474f61a39886d997a8f0d486.png

如果词条中需要包含空格或标点符号,可以用引号标记:

 75420f3b3e3433179371754aa52de5be.png

词条位置的常量也可以放到词汇中:位置常量通常表示文档中关键字的位置。位置信息可以用于进行排名。位置常量的范围是1到16383,最大值默认是16383。

拥有位置的词汇甚至可以用一个权来标记,这个权可以是A,B,C或D。默认的是D,因此输出中不会出现,权可以用来反映文档结构:

89d01f4b4bdb5d985b4a38391bd05a1a.png

除了可以用::tsvector对数据类型进行转换,也可以用 to_tsvector() 函数来转换,但是这两者是有区别的。

to_tsvector() 会在单词检索了之后在单词的后面查询出所在的序号位置:

6dfbec7b43a325fca03e7da3c4db7042.png

tsquery类型表示一个检索条件,存储用于检索的词汇,并且使用布尔操作符&(AND),|(OR)和!(NOT)来组合他们,括号用来强调操作符的分组:

也可以添加一个或者多个权字母来对词汇进行标识:

f35e5fb8ef1fc59aa82d67a087325d86.png

tsquery类型可以对tsvector的数据进行逻辑上的检索和判断:

第一个是判断:结果里面是否有 华为 或者 苹果 或者 oppo 的数据

第二个是判断:结果里面是否有 华为+oppo 或者 苹果 的数据

446604522abb7f7f4fe5d11cb048586d.png

试一下文本搜索分词器处理:搜索后面的单词是否存在于前面的字符串中:

字符串 :: tsvector @@ '搜索的关键字' :: tsquery

公式会返回布尔值,如果找到了关键字则返回 t,否则返回 f。

j. UUID类型

存储通用的唯一表示符。

UUID是一个由算法产生的128位标识符,确保它不可能使用相同算法在已知的模块中产生相同的标识符,它可以比序列更好的保证数据的唯一性。UUID表现为一个小写的十六进制数字的序列,一共由一组8位数字+三组4位数字+一组12位数字 总共32个数字构成。

--先创建一个有uuid类型的表格

--往表格中添加不同格式的uuid数据

65b05ac2eddacb02257771b2f6fbcda6.png

k. JSON数据类型

json类型的数据比文本类型的数据更方便对存入的json数据进行可用的校验。

1511f47b35ac1f2ab8326f12f37b9537.png

如果写入的数据符合json格式,那么插入数据可以成功:

d64a713ffa35f9b2f419ee88e40612ab.png

否则会提示json格式错误:例如下面的 xiaohong,没有表示字符串的引号,所以提示了 xiaohong 的输入错误。

678cc240f5ef47553f61929d7b33bc29.png

l. HLL数据类型

用于存储 HLL 结构(HyperLogLog),大小为固定的1280 bytes,可直接计算得到distinct值,数据计算的误差率最大在2.3%左右。HyperLogLog是一个具有固定大小,类似于集合结构,用于可调精度的不同值计数。

它的作用是统计一个集合中不重复的元素的个数。

--先看看怎么来使用hll类型

创建了表格之后,我们往hll的字段中,添加一个空的hll数据集合,hll_empty()是创建空集合的方法:

852a7b498e13f1b64142dbf6aefada72.png

3c6450ae7ab64485a7478821d39ffc44.png

然后通过update的方式,将数据插入到集合中,我们试试添加三个值到集合里面:

30c228a9af3610200b73d8464595cb22.png

最后查看hll类型数据的基数,显示结果为2,表示这个集合中有两个不重复的数据:

e31942e5d1fd8e1463ec4aa1087f5b07.png

将数字或者文本或者任意类型计算成一个哈希值:

hll_hash_integer()

hll_hash_text()

hll_hash_any()

我们可以看一个实用的例子,一个“网站访客数量统计” 的例子:

--我们先创建一个访问事实表,存储某个用户在某个时间访问过网站的信息

3363f8ef2ef2aee59e8d94e66e68d984.png

--往表格中批量添加数据

2f06ba4a4773ca619cce7536183a8ccf.png

--然后我们创建一个用户日访问表,并且指定列为hll类型

9324ee0173da13a8a8e5d3ce197d94c3.png

--现在根据日期对数据进行分组,并且把数据存放到hll的数据表格中

--计算每一天访问网站的不同用户数量

--查询每个月有多少不同用户访问过网站

用hll可以很好很快的计算这种DV值的数据。

m. 枚举类型

  1. 创建枚举类型

  1. 创建表格,使用刚创建的枚举类型gender

  1. 往表格中添加数据,如果添加的数据不在枚举类型中,那么就会报错

以上这些就是常用数据类型的介绍了,我们下一期来讲各种不同数据类型经常使用的函数操作。 

猜你喜欢

转载自blog.csdn.net/adamconan/article/details/127553151