导语
数据:数据是事实或观察的结果,是对客观事务的逻辑归纳,用于表示客观事物的未加工的原始素材。
数据类型:在GBase 8c中,数据类型是数据的一个基本属性,用于区分不同类型的数据。不同的数据类型所占用的存储空间不同,能够进行的操作也不同。
数据库中的数据存储在数据表中,数据表中的每一列都定义了其数据类型。当用户存储数据时,需要遵循这些数据类型的属性定义否则可能会出现报错或精度丢失等问题。在GBase 8c中,主要的数据类型有:
常用的数据类型:数值类型,字符类型,日期类型等 非常用的数据类型:布尔类型、二进制类型、XML类型、几何类型等。 自定义数据类型
数值类型-整数类型
整数类型 描述 存储空间 范围 TINYIINT 微整数,别名为INT1 1字节 0~255 SMALLINT 小范围整数,别名为INT2 2字节 -32,768~+32,767 INTEGER 常用的整数,INT4 4字节 -2147483648~+2147483647 BINARY_INTEGER INTEGER的别名 4字节 -2147483648~+2147483647 BIGINT 大范围的整数,别名为INT8 8字节 -9,223,372,036,854,775,808 ~ +9,223,372,036,854,775,807 int16 十六字节的大范围整数,目前不支持用于建表等使用 16字节 -170,141,183,460,469,231,731,687,303,715,884,105,728 ~ +170,141,183,460,469,231,731,687,303,715,884,105,727
数值类型-任意精度类型
任意精度类型 描述 存储空间 范围 NUMERIC[(p[,s])] 精度p取值范围[1,1000],标度取值范围[0,p]。p为总位数,s为小数位数。 用户声名精度。每四位(十进制位)占用两个字节,然后再整个数据上加上八个字节的额外开销。 未指定精度的情况下,小数点前最大131,072位,小数点后最大16,383位。 DECIMAL[(p[,s])] 精度p取值范围[1,1000],标度取值范围[0,p]。p为总位数,s为小数位数。 用户声名精度。每四位(十进制位)占用两个字节,然后再整个数据上加上八个字节的额外开销。 未指定精度的情况下,小数点前最大131,072位,小数点后最大16,383位。 NUMBER[(p[x,s])] NUMERIC类型的别名。精度p取值范围[1,1000],标度取值范围[0,p]。p为总位数,s为小数位数。 用户声名精度。每四位(十进制位)占用两个字节,然后再整个数据上加上八个字节的额外开销。 未指定精度的情况下,小数点前最大131,072位,小数点后最大16,383位。
数值类型-序列整数类型
序列整数类型;描述;存储空间;范围
整数类型 描述 存储空间 范围 SMALLSERIAL 二字节序列整型 2字节 -32,768~+32,767 SERIAL 四字节序列整型 四字节 -2,147,483,648 ~ +2,147,483,647 BIGSERIAL 八字节序列整型 8字节 -9,223,372,036,854,775,808 ~ +9,223,372,036,854,775,807 LARGESERIAL 默认插入十六字节序列整型,实际类型和numeric相同 变长类型,每四位(十进制位)占用两个字节,然后再整个数据上加上八个字节的额外开销。 小数点前最大131,072位,小数点后最大16,383
数值类型-浮点类型
整数类型 描述 存储空间 范围 REAL,FLOAT4 单精度浮点数 4字节 -3.402E+38~3.402E+38,6位十进制数字精度。 DOUBLE PRRECISION,BINARY_DOUBLE,FLOAT8 双精度浮点数 8字节 -1.79E+308~1.79E+308,15位十进制数字精度。 FLOAT[§] 精度p取值范围为[1,53],p为精度,表示总位数 4字节或8字节 根据精度p不同选择REAL或DOUBLE PRECISION作为内部表示。如不指定精度,内部用DOUBLE PRECISION表示。
字符类型
整数类型 描述 存储空间 CHAR(n) 定长字符串,不足补空格,n是指字节长度,如不带精度n,默认精度为1 最大为10MB CHARACTER(n) - NCHAR(n) - VARCHAR(n) 变长字符串。不同的兼容模式下,n表示的含义不同(如:PG兼容模式下,n是字符长度;A兼容模式下,n指代字节长度) 最大为10MB CHARACTER - VARYING(n) - VARCHAR2(n) 变长字符串。是VARCHAR(n)类型的别名 最大为10MB NVARCHAR2(n) 变长字符串。n指代字符长度 最大为10MB NVARCHAR(n) 变长字符串。是NVARCHAR2(n)类型的别名 最大为10MB TEXT 变长字符串 最大为1GB-1,但还需要考虑到列描述头信息的大小,以及列所在元组的大小限制(也小于1GB-1),因此TEXT类型最大大小可能小于1GB-1 CLOB 文本大对象,TEXT类型的别名 -
日期/时间类型
整数类型 描述 存储空间 DATE 日期和时间 4字节,A兼容模式时8字节 TIME[( p )][WITHOUT TIME ZONE] 只用于一日内的时间。p表示小数点后的精度,取值范围为0~6 8字节 TIME[( p )][WITH TIME ZONE] 只用于一日内的时间,带时区。p表示小数点后的精度,取值范围为0~6 12字节 TIMESTAMP[( p )][WITHOUT TIME ZONE] 日期和时间,p表示小数点后的精度,取值范围为0~6 8字节 TIMESTAMP[( p )][WITH TIME ZONE] 日期和时间,带时区。别名为TIMESTAMPTZ。取值范围为0~6 8字节 SMALLDATETIME 日期和时间,不带时区,精确到分钟,秒位大于等于30秒进一位 8字节 INTERVAL DAY(l) TO SECOND( p ) 时间间隔,X天X小时X分X秒 l:天数的精度,取值范围为0~6 ,p:秒数的精度,取值范围为0~6 16字节 INTERVAL[fields][( p )] 时间间隔。fields包括:YEAR,MONTH,DAY,HOUR,MINUTE,SECOND,DAY TO HOUR,DAY TO MINUTE,DAY TO SECOND,HOUR TO MINUTE,HOUR TO SECOND,MINUTE TO SECOND。p:秒数的精度,取值范围为0~6。fields为SECOND,DAY TO SECOND,HOUR TO SECOND 或MINUTE TO SECOND时,参数p才有效 12字节
二进制类型
整数类型 描述 存储空间 BLOB 二进制大对象 最大为1GB-8203字节(即1073733621字节) RAW 变长的十六进制类型 最大为1GB-8203字节(即1073733621字节) BYTEA 变长的二进制字符串 最大为1GB-8203字节(即1073733621字节)
布尔类型
“真”值的有效文本值是:TRUE、‘t’、‘true’、‘y’、‘yes’、‘1’、‘TRUE’、true、整数范围内12^63-1、整数范围内-1 -2^63 “假”值的有效文本值是:FALSE、‘f’、‘false’、‘n’、‘no’、‘0’、0、‘FALSE’、false 使用TRUE和FALSE是比较规范的用法(也是SQL兼容的用法)
位串类型
位串就是一串1和0的字符串。他们可以用于存储位掩码。
整数类型 描述 bit(n) bit类型的数据必须准确匹配长度n,如果存储短或者长的数据都会报错 bit varying(n) bit varying类型的数据是最长为n的变长类型,超过n的类型会被拒绝。
如果用户明确地把一个位串值转换成bit(n),则此位串右边的内容将被截断或者在右边补齐零,直到刚好n位,而不会抛出任何错误。 如果用户明确地把一个位串数值转换成bit varying(n),如果它超过了n位,则它的右边将被截断。
其他数据类型-文本搜索类型
整数类型 描述 tsvector 表示为文本搜索优化的文件格式,一个唯一标准词位的有序列表。 tsquery 表示检索条件,存储用于检索的词汇
其他数据类型-UUID类型
整数类型 描述 uuid UUID是一个小写十六进制数据的序列,用来存储通用唯一标识符(UUID)。
其他数据类型-JSON\JSONB类型
整数类型 描述 JSON、JSONB 用来存储JSON数据,可以是单独的标量,也可以是数组,或键值对象
其他数据类型-XML类型
整数类型 描述 xml 用来存储XML(可扩展标记语言)数据
自定义数据类型:用户还可以通过CREATE TYPE 语句创建自定义类型,支持5种
复合类型:由一个属性名和数据类型的列表指定。符合类型本质上和表的行类型相同,但是如果只想定义一种类型,使用CREATE TYPE避免了创建一个实际的表。单独的复合类型也是很有用的,例如可以作为函数的参数或者返回类型。 基本类型:用户可以自定义一种新的基本类型(标量类型)。通常来说这些函数必须是底层语言所编写。 shell类型:是一种用于后面要定义的类型的占位符。在创建基本类型时,需要shell类型作为一种向前引用。 枚举类型:由若干个标签构成的列表,每一个标签值都是一个非空字符串,且字符串长度不能超过63个字节。 集合类型:类似数组,但是没有长度限制,主要在存储过程中使用。
示例:
创建一种符合类型,建表并插入数据以及查询
CREATE TYPE test_type1 AS (f1 int,f2 text);
CREATE TABLE t1(a int ,b test_type1);
INSERT INTO t1(1,(1,'demo'));
SELECT (b).fi FROM t1;
创建一个枚举类型
CREATE TYPE test_type2 AS ENUM('create','modify','closed');
创建一个集合类型
CREATE TYPE test_type3 AS TABLE OF t1;