这里我总结了华为高斯数据库的13种常见类型,除了大家都很熟悉的时间日期、字符串、数字类型等,还有二进制类型、文本搜索类型、HLL类型、JSON类型等。
--我们现在创建一个test_date表格,里面有设置8种不同的时间日期格式
--往表格中添加不同的时间数据
--这里可以看到时间有很多种不同的类型:
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
varchar 不定长字符串,最大长度10485760
char 定长字符串,最大长度10485760
text 不定长字符串,最大长度1073733621
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
money类型的数字只能转换成decimal和number,转换其它类型会报错。
blob 二进制大对象(列存不支持)
raw 变长的十六进制数据(列存不支持)
bytea 变长的二进制字符串
三种类型的存储空间都是最大支持1G~8203字节
--准备一个有三种不同类型的表格,并且添加数据
这里要注意的就是blob这种二进制大对象的数据添加方式:
1. 要先用 empty_blob() 往blob字段中插入空值
2. 然后使用for update对这一行数据进行上锁
3. 根据id列等,对这个数据字段进行update更新,写入二进制的字符数据
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序列号
boolean 就是真和假两个内容,在数据库里面会用t和f来表示真假。
“真”值的有效文本值是:TRUE、't'、'true'、'y'、'yes'、'1';
“假”值的有效文本值是:FALSE、 'f'、 'false'、 'n'、 'no'、'0';
使用 TRUE 和 FALSE 是比较规范的用法,是数据库sql语句的通用写法。
专门存储ipv4,ipv6和MAC地址的信息
cidr 存储IPv4 或 IPv6 网络
inet 存储IPv4 或 IPv6的主机和网络,可以一起存储子网掩码
macaddr 存储MAC地址的数据
用网络地址数据存储地址,可以在存储的时候对输入的错误进行检查,并且后面有一些可以直接支持网络类型的特殊操作和功能等。
--创建一个有网络类型的表格
--往表格中添加三种不同的网络地址数据
用来存储位掩码,位掩码就是用一串0和1的二进制来表示实际的某个内容,例如我有4个不同的权限,每个权限有就是1没有就是0,那么这个用户有哪些权限呢,我们就可以用0011或者1110来表示了。
bit(n) 定长位串类型,bit 类型的数据必须准确匹配长度 n,如果存储短或者长的数据都会报错,没有长度的 bit 等于 bit(1)
bit varying(n) 不定长位串类型,bit varying 类型的数据是最长为 n的变长类型,超过 n 的数据会被拒绝,没有长度的 bit varying 表示没有长度限制
--创建一个位串类型的表格,并且添加数据
tsvector tsvector类型表示一个检索单元,tsvector的值是唯一分词的分类列表,把一句话的词格式化为不同的词条,在进行分词处理的时候tsvector会自动去掉分词中重复的词条,按照一定的顺序录入,to_tsvector函数通常用于解析和标准化文档字符串;
tsquery tsquery类型表示一个检索条件,存储用于检索的词汇,并且使用布尔操作
符&(AND),|(OR)和!(NOT)来组合他们,括号用来强调操作符的分组。to_tsquery函数及plainto_tsquery函数会将单词转换为tsquery类型前进行规范化处理。
通过 tsvector 把一个字符串按照空格进行分词,分词的顺序是按照长短和字母排序的:
如果词条中需要包含空格或标点符号,可以用引号标记:
词条位置的常量也可以放到词汇中:位置常量通常表示文档中关键字的位置。位置信息可以用于进行排名。位置常量的范围是1到16383,最大值默认是16383。
拥有位置的词汇甚至可以用一个权来标记,这个权可以是A,B,C或D。默认的是D,因此输出中不会出现,权可以用来反映文档结构:
除了可以用::tsvector对数据类型进行转换,也可以用 to_tsvector() 函数来转换,但是这两者是有区别的。
to_tsvector() 会在单词检索了之后在单词的后面查询出所在的序号位置:
tsquery类型表示一个检索条件,存储用于检索的词汇,并且使用布尔操作符&(AND),|(OR)和!(NOT)来组合他们,括号用来强调操作符的分组:
也可以添加一个或者多个权字母来对词汇进行标识:
tsquery类型可以对tsvector的数据进行逻辑上的检索和判断:
第一个是判断:结果里面是否有 华为 或者 苹果 或者 oppo 的数据
第二个是判断:结果里面是否有 华为+oppo 或者 苹果 的数据
试一下文本搜索分词器处理:搜索后面的单词是否存在于前面的字符串中:
字符串 :: tsvector @@ '搜索的关键字' :: tsquery
公式会返回布尔值,如果找到了关键字则返回 t,否则返回 f。
存储通用的唯一表示符。
UUID是一个由算法产生的128位标识符,确保它不可能使用相同算法在已知的模块中产生相同的标识符,它可以比序列更好的保证数据的唯一性。UUID表现为一个小写的十六进制数字的序列,一共由一组8位数字+三组4位数字+一组12位数字 总共32个数字构成。
--先创建一个有uuid类型的表格
--往表格中添加不同格式的uuid数据
json类型的数据比文本类型的数据更方便对存入的json数据进行可用的校验。
如果写入的数据符合json格式,那么插入数据可以成功:
否则会提示json格式错误:例如下面的 xiaohong,没有表示字符串的引号,所以提示了 xiaohong 的输入错误。
用于存储 HLL 结构(HyperLogLog),大小为固定的1280 bytes,可直接计算得到distinct值,数据计算的误差率最大在2.3%左右。HyperLogLog是一个具有固定大小,类似于集合结构,用于可调精度的不同值计数。
它的作用是统计一个集合中不重复的元素的个数。
--先看看怎么来使用hll类型
创建了表格之后,我们往hll的字段中,添加一个空的hll数据集合,hll_empty()是创建空集合的方法:
然后通过update的方式,将数据插入到集合中,我们试试添加三个值到集合里面:
最后查看hll类型数据的基数,显示结果为2,表示这个集合中有两个不重复的数据:
将数字或者文本或者任意类型计算成一个哈希值:
hll_hash_integer()
hll_hash_text()
hll_hash_any()
我们可以看一个实用的例子,一个“网站访客数量统计” 的例子:
--我们先创建一个访问事实表,存储某个用户在某个时间访问过网站的信息
--往表格中批量添加数据
--然后我们创建一个用户日访问表,并且指定列为hll类型
--现在根据日期对数据进行分组,并且把数据存放到hll的数据表格中
--计算每一天访问网站的不同用户数量
--查询每个月有多少不同用户访问过网站
用hll可以很好很快的计算这种DV值的数据。
以上这些就是常用数据类型的介绍了,我们下一期来讲各种不同数据类型经常使用的函数操作。