华为云用户手册

  • 函数和操作符 操作符可以对一个或多个操作数进行处理,位置上可能处于操作数之前、之后,或两个操作数中间。完成处理之后,返回处理结果。 函数是对一些业务逻辑的封装,以完成特定的功能。函数可以有参数,也可以没有参数。函数是有返回类型的,执行完成后,会返回执行结果。 对于系统函数,用户可以进行修改,但是修改之后系统函数的语义可能会发生改变,从而导致系统控制紊乱。正常情况下不允许用户手工修改系统函数。 当GUC参数behavior_compat_options含有'enable_funcname_with_argsname'选项时,投影别名显示完整函数。 逻辑操作符 比较操作符 字符处理函数和操作符 二进制字符串函数和操作符 位串函数和操作符 模式匹配操作符 数字操作函数和操作符 时间和日期处理函数和操作符 类型转换函数 几何函数和操作符 网络地址函数和操作符 文本检索函数和操作符 JSON/JSONB函数和操作符 HLL函数和操作符 SEQUENCE函数 数组函数和操作符 范围函数和操作符 聚集函数 窗口函数 安全函数 账本数据库的函数 密态函数和操作符 返回集合的函数 条件表达式函数 系统信息函数 系统管理函数 统计信息函数 触发器函数 HashFunc函数 提示信息函数 故障注入系统函数 重分布函数 分布列推荐函数 其他系统函数 内部函数 AI特性函数 动态数据脱敏函数 hotkey特性函数 Global SysCache特性函数 数据损坏检测修复函数 XML类型函数 XMLTYPE类型函数 废弃函数 父主题: SQL参考
  • 列存表支持的数据类型 列存表支持的数据类型如表1所示。 表1 列存表支持的数据类型 类别 数据类型 长度 是否支持 Numeric Types smallint 2 支持 integer 4 支持 bigint 8 支持 decimal -1 支持 numeric -1 支持 real 4 支持 double precision 8 支持 smallserial 2 支持 serial 4 支持 bigserial 8 支持 Monetary Types money 8 支持 Character Types character varying(n), varchar(n) -1 支持 character(n), char(n) n 支持 character、char 1 支持 text -1 支持 nvarchar2 -1 支持 name 64 不支持 Date/Time Types timestamp with time zone 8 支持 timestamp without time zone 8 支持 date 4 支持 time without time zone 8 支持 time with time zone 12 支持 interval 16 支持 big object clob -1 支持 blob -1 不支持 other types … … 不支持 父主题: 数据类型
  • aclitem类型 aclitem数据类型是用来存储对象权限信息的,它的内部实现是int类型,支持的格式为‘user1=privs/user2’。 aclitem[]数据类型为aclitem组成的数组,支持的格式为‘{user1=privs1/user3,user2=privs2/user3}’。 其中user1,user2和user3为数据库中已存在的用户/角色名,privs为数据库中支持的权限(参见表2)。 示例: gaussdb=# create table table_acl (id int,priv aclitem,privs aclitem[]);--新建一张数据表table_acl,有三个字段,类型分别为int,aclitem,aclitem[]gaussdb=# insert into table_acl values (1,'user1=arw/omm','{omm=d/user2,omm=w/omm}');--向数据表table_acl插入一条内容为(1,'user1=arw/omm','{omm=d/user2,omm=w/omm}')的数据gaussdb=# insert into table_acl values (2,'user1=aw/omm','{omm=d/user2}');--向数据表table_acl再插入一条内容为(2,'user1=aw/omm','{omm=d/user2}')的数据gaussdb=# select * from table_acl; id | priv | privs----+---------------+------------------------- 1 | user1=arw/omm | {omm=d/user2,omm=w/omm} 2 | user1=aw/omm | {omm=d/user2}(2 rows) 父主题: 数据类型
  • 对象标识符类型 GaussDB在内部使用对象标识符(OID)作为各种系统表的主键。系统不会给用户创建的表增加一个OID系统字段,OID类型代表一个对象标识符。 目前OID类型用一个四字节的无符号整数实现。因此不建议在创建的表中使用OID字段做主键。 表1 对象标识符类型 名称 引用 描述 示例 OID - 数字化的对象标识符。 564182 CID - 命令标识符。它是系统字段cmin和cmax的数据类型。命令标识符是32位的量。 - XID - 事务标识符。它是系统字段xmin和xmax的数据类型。事务标识符也是64位的量。 - TID - 行标识符。它是系统表字段ctid的数据类型。行ID是一对数值(块号,块内的行索引),它标识该行在其所在表内的物理位置。 - REGCONFIG pg_ts_config 文本搜索配置。 english REGDICTIONARY pg_ts_dict 文本搜索字典。 simple REGOPER pg_operator 操作符名。 - REGOPERATOR pg_operator 带参数类型的操作符。 *(integer,integer)或-(NONE,integer) REGPROC pg_proc 函数名称。 sum REGPROCEDURE pg_proc 带参数类型的函数。 sum(int4) REGCLASS pg_class 关系名。 pg_type REGTYPE pg_type 数据类型名。 integer OID类型:主要作为数据库系统表中字段使用。 示例: 12345 gaussdb=# SELECT oid FROM pg_class WHERE relname = 'pg_type'; oid ------ 1247(1 row) OID别名类型REGCLASS:主要用于对象OID值的简化查找。 示例: 1 2 3 4 5 6 7 8 9101112131415161718192021222324252627282930313233343536373839404142 gaussdb=# SELECT attrelid,attname,atttypid,attstattarget FROM pg_attribute WHERE attrelid = 'pg_type'::REGCLASS; attrelid | attname | atttypid | attstattarget ----------+------------+----------+--------------- 1247 | xc_node_id | 23 | 0 1247 | tableoid | 26 | 0 1247 | cmax | 29 | 0 1247 | xmax | 28 | 0 1247 | cmin | 29 | 0 1247 | xmin | 28 | 0 1247 | oid | 26 | 0 1247 | ctid | 27 | 0 1247 | typname | 19 | -1 1247 | typnamespace | 26 | -1 1247 | typowner | 26 | -1 1247 | typlen | 21 | -1 1247 | typbyval | 16 | -1 1247 | typtype | 18 | -1 1247 | typcategory | 18 | -1 1247 | typispreferred | 16 | -1 1247 | typisdefined | 16 | -1 1247 | typdelim | 18 | -1 1247 | typrelid | 26 | -1 1247 | typelem | 26 | -1 1247 | typarray | 26 | -1 1247 | typinput | 24 | -1 1247 | typoutput | 24 | -1 1247 | typreceive | 24 | -1 1247 | typsend | 24 | -1 1247 | typmodin | 24 | -1 1247 | typmodout | 24 | -1 1247 | typanalyze | 24 | -1 1247 | typalign | 18 | -1 1247 | typstorage | 18 | -1 1247 | typnotnull | 16 | -1 1247 | typbasetype | 26 | -1 1247 | typtypmod | 23 | -1 1247 | typndims | 23 | -1 1247 | typcollation | 26 | -1 1247 | typdefaultbin | 194 | -1 1247 | typdefault | 25 | -1 1247 | typacl | 1034 | -1(38 rows) 父主题: 数据类型
  • 账本数据库使用的数据类型 账本数据库使用HASH16数据类型来存储行级hash摘要或表级hash摘要,使用HASH32数据类型来存储全局hash摘要或者历史表校验hash(当前特性是实验室特性,使用时请联系华为工程师提供技术支持)。 表1 账本数据库HASH类型 名称 描述 存储空间 范围 HASH16 以无符号64位整数存储。 8字节 0 ~ +18446744073709551615 HASH32 以包含16个的无符号整形元素数的组存储。 16字节 16个元素的无符号整形数组能够包含的取值范围。 HASH16数据类型用来在账本数据库中存储行级或表级hash摘要。在获得长度为16个字符串的十六进制字符串的hash序列后,系统将调用hash16in函数将该序列转换为一个无符号64位整数存储进HASH16类型变量中。示例如下: 十六进制字符串:e697da2eaa3a775b 对应的无符号64位整数:16615989244166043483十六进制字符串:ffffffffffffffff 对应的无符号64位整数:18446744073709551615 HASH32数据类型用来在账本数据库中存储全局hash摘要或者历史表校验hash。在获得长度为32个字符串的十六进制字符串的hash序列后,系统将调用hash32in函数将该序列转换到一个包含16个无符号整形元素的数组中。示例如下: 十六进制字符串:685847ed1fe38e18f6b0e2b18c00edee 对应的HASH32数组:[104,88,71,237,31,227,142,24,246,176,226,177,140,0,237,238] 父主题: 数据类型
  • tsquery tsquery类型表示一个检索条件,存储用于检索的词汇,并且使用布尔操作符&(AND),|(OR)和!(NOT)来组合他们,括号用来强调操作符的分组。to_tsquery函数及plainto_tsquery函数会将单词转换为tsquery类型前进行规范化处理。tsquery类型支持的最大长度没有限制。 1 2 3 4 5 6 7 8 91011121314151617 gaussdb=# SELECT 'fat & rat'::tsquery; tsquery --------------- 'fat' & 'rat'(1 row)gaussdb=# SELECT 'fat & (rat | cat)'::tsquery; tsquery --------------------------- 'fat' & ( 'rat' | 'cat' )(1 row)gaussdb=# SELECT 'fat & rat & ! cat'::tsquery; tsquery ------------------------ 'fat' & 'rat' & !'cat'(1 row) 在没有括号的情况下,!(非)结合的最紧密,而&(和)结合的比|(或)紧密。 tsquery中的词汇可以用一个或多个权字母来标记,这些权字母限制这次词汇只能与带有匹配权的tsvector词汇进行匹配。 12345 gaussdb=# SELECT 'fat:ab & cat'::tsquery; tsquery ------------------ 'fat':AB & 'cat'(1 row) 同样,tsquery中的词汇可以用*标记来指定前缀匹配: 12345 gaussdb=# SELECT 'super:*'::tsquery; tsquery ----------- 'super':*(1 row) 这个查询可以匹配tsvector中以“super”开始的任意单词。 请注意,前缀首先被文本搜索分词器处理,这也就意味着下面的结果为真: 12345 gaussdb=# SELECT to_tsvector( 'seriousness' ) @@ to_tsquery( 'series:*' ) AS RESULT; result ---------- t(1 row) 因为series经过处理后得到seri: 12345 gaussdb=# SELECT to_tsquery('series:*'); to_tsquery ------------ 'seri':*(1 row) 这样就匹配eriousness了。 'Fat:ab & Cats'规范化转为tsquery类型结果如下: 12345 gaussdb=# SELECT to_tsquery('Fat:ab & Cats'); to_tsquery ------------------ 'fat':AB & 'cat'(1 row)
  • tsvector tsvector类型表示一个检索单元,通常是一个数据库表中一行的文本字段或者这些字段的组合,tsvector类型的值是一个标准词位的有序列表,标准词位就是把同一个词的变型体都标准化相同的,在输入的同时会自动排序和消除重复,支持的最大长度为2046字节。to_tsvector函数通常用于解析和标准化文档字符串。 tsvector的值是唯一分词的分类列表,把一句话的词格式化为不同的词条,在进行分词处理的时候tsvector会自动去掉分词中重复的词条,按照一定的顺序录入。如: 12345 gaussdb=# SELECT 'a fat cat sat on a mat and ate a fat rat'::tsvector; tsvector ---------------------------------------------------- 'a' 'and' 'ate' 'cat' 'fat' 'mat' 'on' 'rat' 'sat'(1 row) 从上面的例子可以看出,通过tsvector把一个字符串按照空格进行分词,分词的顺序是按照长短和字母排序的。但是如果词条中需要包含空格或标点符号,可以用引号标记: 12345 gaussdb=# SELECT $$the lexeme ' ' contains spaces$$::tsvector; tsvector ------------------------------------------- ' ' 'contains' 'lexeme' 'spaces' 'the'(1 row) 如果在词条中使用引号,可以使用双$$符号作为标记: 12345 gaussdb=# SELECT $$the lexeme 'Joe''s' contains a quote$$::tsvector; tsvector ------------------------------------------------ 'Joe''s' 'a' 'contains' 'lexeme' 'quote' 'the'(1 row) 词条位置常量也可以放到词汇中: 12345 gaussdb=# SELECT 'a:1 fat:2 cat:3 sat:4 on:5 a:6 mat:7 and:8 ate:9 a:10 fat:11 rat:12'::tsvector; tsvector ------------------------------------------------------------------------------- 'a':1,6,10 'and':8 'ate':9 'cat':3 'fat':2,11 'mat':7 'on':5 'rat':12 'sat':4(1 row) 位置常量通常表示文档中源字的位置。位置信息可以用于进行排名。位置常量的范围是1到255,最大值默认是255。相同词的重复位会被忽略掉。 拥有位置的词汇甚至可以用一个权来标记,这个权可以是A,B,C或D。默认的是D,因此输出中不会出现: 12345 gaussdb=# SELECT 'a:1A fat:2B,4C cat:5D'::tsvector; tsvector ---------------------------- 'a':1A 'cat':5 'fat':2B,4C(1 row) 权可以用来反映文档结构,如:标记标题与主体文字的区别。全文检索排序函数可以为不同的权标记分配不同的优先级。 下面的示例是tsvector类型标准用法。如: 12345 gaussdb=# SELECT 'The Fat Rats'::tsvector; tsvector -------------------- 'Fat' 'Rats' 'The'(1 row) 但是对于英文全文检索应用来说,上面的单词会被认为非规范化的,所以需要通过to_tsvector函数对这些单词进行规范化处理: 12345 gaussdb=# SELECT to_tsvector('english', 'The Fat Rats'); to_tsvector ----------------- 'fat':2 'rat':3(1 row)
  • 伪类型 GaussDB数据类型中包含一系列特殊用途的类型,这些类型按照类别被称为伪类型。伪类型不能作为字段的数据类型,但是可以用于声明函数的参数或者结果类型。 当一个函数不仅是简单地接受并返回某种SQL数据类型的情况下伪类型是很有用的。表1列出了所有的伪类型。 表1 伪类型 名称 描述 any 表示函数接受任何输入数据类型。 anyelement 表示函数接受任何数据类型。 anyarray 表示函数接受任意数组数据类型。 anynonarray 表示函数接受任意非数组数据类型。 anyenum 表示函数接受任意枚举数据类型。 anyrange 表示函数接受任意范围数据类型。 cstring 表示函数接受或者返回一个空结尾的C字符串。 internal 表示函数接受或者返回一种服务器内部的数据类型。 language_handler 声明一个过程语言调用句柄返回language_handler。 fdw_handler 声明一个外部数据封装器返回fdw_handler。 record 标识函数返回一个未声明的行类型。 trigger 声明一个触发器函数返回trigger。 void 表示函数不返回数值。 opaque 一个已经过时的类型,以前用于所有上面这些用途。 声明用C编写的函数(不管是内置的还是动态装载的)都可以接受或者返回任何这样的伪数据类型。当伪类型作为参数类型使用时,用户需要保证函数的正常运行。 用过程语言编写的函数只能使用实现语言允许的伪类型。目前,过程语言都不允许使用作为参数类型的伪类型,并且只允许使用void和record作为结果类型。一些多态的函数还支持使用anyelement,anyarray,anynonarray anyenum和anyrange类型。 每一个被声明为anyelement的位置(参数或返回值)被允许具有任意特定的实际数据类型,但是再任何给定的查询中他们必须全部是相同的实际类型。 伪类型internal用于声明那种只能在数据库系统内部调用的函数,他们不能直接在SQL查询里调用。如果函数至少有一个internal类型的参数,则不能从SQL里调用他。建议不要创建任何声明返回internal的函数,除非他至少有一个internal类型的参数。 示例: 1 2 3 4 5 6 7 8 91011121314151617181920212223 --创建表gaussdb=# create table t1 (a int);--插入两条数据gaussdb=# insert into t1 values(1),(2);--创建函数showall()。gaussdb=# CREATE OR REPLACE FUNCTION showall() RETURNS SETOF recordAS $$ SELECT count(*) from t1; $$LANGUAGE SQL;--调用函数showall()。gaussdb=# SELECT showall(); showall --------- (2)(1 row)--删除函数。gaussdb=# DROP FUNCTION showall();--删除表gaussdb=# drop table t1; 父主题: 数据类型
  • 包含和排除边界 每一个非空范围都有两个界限,下界和上界。这些值之间的所有点都被包括在范围内。一个包含界限意味着边界点本身也被包括在范围内,而一个排除边界意味着边界点不被包括在范围内。 在一个范围的文本形式中,一个包含下界被表达为“[”而一个排除下界被表达为“(”。同样,一个包含上界被表达为“]”而一个排除上界被表达为“)”(详见范围输入/输出)。 函数lower_inc和upper_inc分别测试一个范围值的上下界。
  • 构造范围 每一种范围类型都有一个与其同名的构造器函数。使用构造器函数常常比写一个范围文字常数更方便,因为它避免了对界限值的额外引用。构造器函数接受两个或三个参数。两个参数的形式以标准的形式构造一个范围(下界是包含的,上界是排除的),而三个参数的形式按照第三个参数指定的界限形式构造一个范围。第三个参数必须是下列字符串之一: “()”、 “(]”、 “[)”或者 “[]”。 例如: -- 完整形式是:下界、上界以及指示界限包含性/排除性的文本参数。 SELECT numrange(1.0, 14.0, '(]'); -- 如果第三个参数被忽略,则假定为 '[)'。 SELECT numrange(1.0, 14.0); -- 尽管这里指定了 '(]',显示时该值将被转换成标准形式,因为 int8range 是一种离散范围类型(见下文)。 SELECT int8range(1, 14, '(]'); -- 为一个界限使用 NULL 导致范围在那一边是无界的。 SELECT numrange(NULL, 2.2);
  • 无限(无界)范围 一个范围的下界可以被忽略,意味着所有小于上界的值都被包括在范围中,例如(,3]。 同样,如果范围的上界被忽略,那么所有比上界大的值都被包括在范围中。如果上下界都被忽略,该元素类型的所有值都被认为在该范围中。 规定缺失的包括界限自动转换为排除,例如,[,] 转换为 (,)。 你可以认为这些缺失值为 +/- 无穷大,但它们是特殊范围类型值,并且被视为超出任何范围元素类型的 +/- 无穷大值。 具有“infinity”概念的元素类型可以用它们作为显式边界值。 例如,在时间戳范围,[today,infinity) 不包括特殊的 timestamp 值 infinity,尽管 [today,infinity] 包括它,就好比 [today,) 和 [today,]。 函数lower_inf和upper_inf分别测试一个范围的无限上下界。
  • 范围输入/输出 一个范围值的输入必须遵循下列模式之一: (lower-bound,upper-bound) (lower-bound,upper-bound] [lower-bound,upper-bound) [lower-bound,upper-bound] empty 圆括号或方括号指示上下界是否为排除的或者包含的。注意最后一个模式是empty,它表示一个空范围(一个不包含点的范围)。 lower-bound可以是作为 subtype 的合法输入的一个字符串,或者是空表示没有下界。同样,upper-bound可以是作为 subtype 的合法输入的一个字符串,或者是空表示没有上界。 每个界限值可以使用"(双引号)字符引用。如果界限值包含圆括号、方括号、逗号、双引号或反斜线时,这样做是必须的,因为否则那些字符会被认作范围语法的一部分。要把一个双引号或反斜线放在一个被引用的界限值中,就在它前面放一个反斜线(还有,在一个双引号引用的界限值中的一对双引号表示一个双引号字符,这与 SQL 字符串中的单引号规则类似)。此外,你可以避免引用并且使用反斜线转义来保护所有数据字符,否则它们会被当做返回语法的一部分。还有,要写一个是空字符串的界限值,则可以写成"",因为什么都不写表示一个无限界限。 范围值前后允许有空格,但是圆括号或方括号之间的任何空格会被当做上下界值的一部分(取决于元素类型,它可能是也可能不是有意义的)。 例子: -- 包括 3,不包括 7,并且包括 3 和 7 之间的所有点 SELECT '[3,7)'::int4range; -- 既不包括 3 也不包括 7,但是包括之间的所有点 SELECT '(3,7)'::int4range; -- 只包括单独一个点 4 SELECT '[4,4]'::int4range; -- 不包括点(并且将被标准化为 '空') SELECT '[4,4)'::int4range;
  • JSONB高级特性 注意事项 不支持列存。 不支持作为分区键。 不支持外表。 JSON和JSONB的主要差异在于存储方式上的不同,JSONB存储的是解析后的二进制,能够体现JSON的层次结构,更方便直接访问等,因此JSONB会有很多JSON所不具有的高级特性。 格式归一化 对于输入的object-json字符串,解析成jsonb二进制后,会天然的丢弃语义上无关紧要的细节,比如空格: gaussdb=# select ' [1, " a ", {"a" :1 }] '::jsonb; jsonb---------------------- [1, " a ", {"a": 1}](1 row) 对于object-json,会删除重复的键值,只保留最后一个出现的,如: gaussdb=# select '{"a" : 1, "a" : 2}'::jsonb; jsonb---------- {"a": 2}(1 row) 对于object-json,键值会重新进行排序,排序规则:长度长的在后、长度相等则ascii码大的在后,如: gaussdb=# select '{"aa" : 1, "b" : 2, "a" : 3}'::jsonb; jsonb--------------------------- {"a": 3, "b": 2, "aa": 1}(1 row)
  • 离散范围类型 一种范围的元素类型具有一个良定义的“步长”,例如integer或date。在这些类型中,如果两个元素之间没有合法值,它们可以被说成是相邻。这与连续范围相反,连续范围中总是(或者几乎总是)可以在两个给定值之间标识其他元素值。例如,numeric类型之上的一个范围就是连续的,timestamp上的范围也是(尽管timestamp具有有限的精度,并且在理论上可以被当做离散的,最好认为它是连续的,因为通常并不关心它的步长)。 另一种考虑离散范围类型的方法是对每一个元素值都有一种清晰的“下一个”或“上一个”值。了解了这种思想之后,通过选择原来给定的下一个或上一个元素值来取代它,就可以在一个范围界限的包含和排除表达之间转换。例如,在一个整数范围类型中,[4,8]和(3,9)表示相同的值集合,但是对于 numeric 上的范围就不是这样。 一个离散范围类型应该具有一个正规化函数,它知道元素类型期望的步长。正规化函数负责把范围类型的相等值转换成具有相同的表达,特别是与包含或者排除界限一致。如果没有指定一个正规化函数,那么具有不同格式的范围将总是会被当作不等,即使它们实际上是表达相同的一组值。 内建的范围类型int4range、int8range和daterange都使用一种正规的形式,该形式包括下界并且排除上界,也就是[)。不过,用户定义的范围类型可以使用其他习惯。
  • 位串类型 位串就是一串1和0的字符串。它们可以用于存储位掩码。 GaussDB支持两种位串类型:bit(n)和bit varying(n),这里的n是一个正整数,n最大取值为83886080,相当于10M的容量。 bit类型的数据必须准确匹配长度n,如果存储短或者长的数据都会报错。bit varying类型的数据是最长为n的变长类型,超过n的类型会被拒绝。一个没有长度的bit等效于bit(1),没有长度的bit varying表示没有长度限制。 如果用户明确地把一个位串值转换成bit(n),则此位串右边的内容将被截断或者在右边补齐零,直到刚好n位,而不会抛出任何错误。 如果用户明确地把一个位串数值转换成bit varying(n),如果它超过了n位,则它的右边将被截断。 使用ADMS平台8.1.3-200驱动版本及之前版本时,写入bit类型需要用::bit varying进行类型转换,否则可能出现异常报错。 1 2 3 4 5 6 7 8 91011121314151617181920212223242526272829 --创建表。gaussdb=# CREATE TABLE bit_type_t1 ( BT_COL1 INTEGER, BT_COL2 BIT(3), BT_COL3 BIT VARYING(5)) DISTRIBUTE BY REPLICATION;--插入数据。gaussdb=# INSERT INTO bit_type_t1 VALUES(1, B'101', B'00');--插入数据的长度不符合类型的标准会报错。gaussdb=# INSERT INTO bit_type_t1 VALUES(2, B'10', B'101');ERROR: bit string length 2 does not match type bit(3)CONTEXT: referenced column: bt_col2--将不符合类型长度的数据进行转换。gaussdb=# INSERT INTO bit_type_t1 VALUES(2, B'10'::bit(3), B'101');--查看数据。gaussdb=# SELECT * FROM bit_type_t1; bt_col1 | bt_col2 | bt_col3 ---------+---------+--------- 1 | 101 | 00 2 | 100 | 101(2 rows)--删除表。gaussdb=# DROP TABLE bit_type_t1; 父主题: 数据类型
  • UUID类型 UUID数据类型用来存储RFC 4122,ISO/IEF 9834-8:2005以及相关标准定义的通用唯一标识符(UUID)。这个标识符是一个由算法产生的128位标识符,确保它不可能使用相同算法在已知的模块中产生的相同标识符。 因此,对分布式系统而言,这种标识符比序列能更好的保证唯一性,因为序列只能在单一数据库中保证是唯一。 UUID是一个小写十六进制数字的序列,由分字符分成几组,一组8位数字+三组4位数字+一组12位数字,总共32个数字代表128位,标准的UUID示例如下: a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11 GaussDB同样支持以其他方式输入:大写字母和数字、由花括号包围的标准格式、省略部分或所有连字符、在任意一组四位数字之后加一个连字符。示例: A0EEBC99-9C0B-4EF8-BB6D-6BB9BD380A11{a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11}a0eebc999c0b4ef8bb6d6bb9bd380a11a0ee-bc99-9c0b-4ef8-bb6d-6bb9-bd38-0a11 一般是以标准格式输出。 父主题: 数据类型
  • shared_preload_libraries 参数说明:此参数用于声明一个或者多个在服务器启动的时候预先装载的共享库,多个库名称之间用逗号分隔,仅sysadmin用户可以访问。比如'$libdir/mylib'会在加载标准库目录中的库文件之前预先加载mylib.so(某些平台上可能是mylib.sl)库文件。 可以用这个方法预先装载GaussDB的存储过程库,通常是使用'$libdir/plXXX'语法。XXX只能是pgsql,perl,tcl,python之一。 通过预先装载一个共享库并在需要的时候初始化它,可以避免第一次使用这个库的加载时间。但是启动每个服务器进程的时间可能会增加,即使进程从来没有使用过这些库。因此建议对那些将被大多数会话使用的库才使用这个选项。 该参数属于POSTMASTER类型参数,请参考表1中对应设置方法进行设置。 如果被声明的库不存在,GaussDB服务将会启动失败。 每一个支持GaussDB的库都有一个特殊的标记用于保证兼容性。因此,不支持GaussDB的库不能用这种方法加载。 取值范围:字符串 默认值:security_plugin
  • 数值类型 表1列出了所有的可用类型。数字操作符和相关的内置函数请参见数字操作函数和操作符。 表1 整数类型 名称 描述 存储空间 范围 TINYINT 微整数,别名为INT1。 1字节 0 ~ 255 SMALLINT 小范围整数,别名为INT2。 2字节 -32,768 ~ +32,767 INTEGER 常用的整数,别名为INT4。 4字节 -2,147,483,648 ~ +2,147,483,647 BINARY_INTEGER 常用的整数INTEGER的别名,为兼容Oracle类型。 4字节 -2,147,483,648 ~ +2,147,483,647 BIGINT 大范围的整数,别名为INT8。 8字节 -9,223,372,036,854,775,808 ~ +9,223,372,036,854,775,807 示例: --创建具有TINYINT类型数据的表。gaussdb=# CREATE TABLE int_type_t1 ( IT_COL1 TINYINT );--插入数据。gaussdb=# INSERT INTO int_type_t1 VALUES(10);--查看数据。gaussdb=# SELECT * FROM int_type_t1; it_col1 --------- 10(1 row)--删除表。gaussdb=# DROP TABLE int_type_t1; 1 2 3 4 5 6 7 8 9101112131415161718192021 --创建具有TINYINT,INTEGER,BIGINT类型数据的表。gaussdb=# CREATE TABLE int_type_t2 ( a TINYINT, b TINYINT, c INTEGER, d BIGINT);--插入数据。gaussdb=# INSERT INTO int_type_t2 VALUES(100, 10, 1000, 10000);--查看数据。gaussdb=# SELECT * FROM int_type_t2; a | b | c | d -----+----+------+------- 100 | 10 | 1000 | 10000(1 row)--删除表。gaussdb=# DROP TABLE int_type_t2; TINYINT、SMALLINT、INTEGER和BIGINT类型存储各种范围的数字,也就是整数。试图存储超出范围以外的数值将会导致错误。 常用的类型是INTEGER,因为它提供了在范围、存储空间、性能之间的最佳平衡。一般只有取值范围确定不超过SMALLINT的情况下,才会使用SMALLINT类型。而只有在INTEGER的范围不够的时候才使用BIGINT,因为前者相对快得多。 表2 任意精度型 名称 描述 存储空间 范围 NUMERIC[(p[,s])], DECIMAL[(p[,s])] 精度p取值范围为[1,1000],标度s取值范围为[0,p]。 说明: p为总位数,s为小数位数。 用户声明精度。每四位(十进制位)占用两个字节,然后在整个数据上加上八个字节的额外开销。 未指定精度的情况下,小数点前最大131,072位,小数点后最大16,383位。 NUMBER[(p[,s])] NUMERIC类型的别名,为兼容Oracle数据类型。 用户声明精度。每四位(十进制位)占用两个字节,然后在整个数据上加上八个字节的额外开销。 未指定精度的情况下,小数点前最大131,072位,小数点后最大16,383位。 示例: --创建表。gaussdb=# CREATE TABLE decimal_type_t1 ( DT_COL1 DECIMAL(10,4));--插入数据。gaussdb=# INSERT INTO decimal_type_t1 VALUES(123456.122331);--查询表中的数据。gaussdb=# SELECT * FROM decimal_type_t1; dt_col1 ------------- 123456.1223(1 row)--删除表。gaussdb=# DROP TABLE decimal_type_t1; 1 2 3 4 5 6 7 8 9101112131415161718 --创建表。gaussdb=# CREATE TABLE numeric_type_t1 ( NT_COL1 NUMERIC(10,4));--插入数据。gaussdb=# INSERT INTO numeric_type_t1 VALUES(123456.12354);--查询表中的数据。gaussdb=# SELECT * FROM numeric_type_t1; nt_col1 ------------- 123456.1235(1 row)--删除表。gaussdb=# DROP TABLE numeric_type_t1; 与整数类型相比,任意精度类型需要更大的存储空间,其存储效率、运算效率以及压缩比效果都要差一些。在进行数值类型定义时,优先选择整数类型。当且仅当数值超出整数可表示最大范围时,再选用任意精度类型。 使用Numeric/Decimal进行列定义时,建议指定该列的精度p以及标度s。 表3 序列整型 名称 描述 存储空间 范围 SMALLSERIAL 二字节序列整型。 2字节 -32,768 ~ +32,767 SERIAL 四字节序列整型。 4字节 -2,147,483,648 ~ +2,147,483,647 BIGSERIAL 八字节序列整型。 8字节 -9,223,372,036,854,775,808 ~ +9,223,372,036,854,775,807 示例: 1 2 3 4 5 6 7 8 9101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657 --创建表。gaussdb=# CREATE TABLE smallserial_type_tab(a SMALLSERIAL);--插入数据。gaussdb=# INSERT INTO smallserial_type_tab VALUES(default);--再次插入数据。gaussdb=# INSERT INTO smallserial_type_tab VALUES(default);--查看数据。gaussdb=# SELECT * FROM smallserial_type_tab; a --- 1 2(2 rows)--创建表。gaussdb=# CREATE TABLE serial_type_tab(b SERIAL);--插入数据。gaussdb=# INSERT INTO serial_type_tab VALUES(default);--再次插入数据。gaussdb=# INSERT INTO serial_type_tab VALUES(default);--查看数据。gaussdb=# SELECT * FROM serial_type_tab; b --- 1 2(2 rows)--创建表。gaussdb=# CREATE TABLE bigserial_type_tab(c BIGSERIAL);--插入数据。gaussdb=# INSERT INTO bigserial_type_tab VALUES(default);--插入数据。gaussdb=# INSERT INTO bigserial_type_tab VALUES(default);--查看数据。gaussdb=# SELECT * FROM bigserial_type_tab; c --- 1 2(2 rows)--删除表。gaussdb=# DROP TABLE smallserial_type_tab;gaussdb=# DROP TABLE serial_type_tab;gaussdb=# DROP TABLE bigserial_type_tab; SMALLSERIAL,SERIAL和BIGSERIAL类型不是真正的类型,只是为在表中设置唯一标识做的概念上的便利。因此,创建一个整数字段,并且把它的缺省数值安排为从一个序列发生器读取。应用了一个NOT NULL约束以确保NULL不会被插入。在大多数情况下用户可能还希望附加一个UNIQUE或PRIMARY KEY约束避免意外地插入重复的数值,但这个不是自动的。最后,将序列发生器从属于那个字段,这样当该字段或表被删除的时候也一并删除它。目前只支持在创建表时候指定SERIAL列,不可以在已有的表中,增加SERIAL列。另外临时表也不支持创建SERIAL列。因为SERIAL不是真正的类型,也不可以将表中存在的列类型转化为SERIAL。 表4 浮点类型 名称 描述 存储空间 范围 REAL, FLOAT4 单精度浮点数,不精准。 4字节 -3.402E+38~3.402E+38,6位十进制数字精度。 DOUBLE PRECISION, FLOAT8 双精度浮点数,不精准。 8字节 -1.79E+308~1.79E+308,15位十进制数字精度。 FLOAT[(p)] 浮点数,不精准。精度p取值范围为[1,53]。 说明: p为精度,表示二进制总位数。 4字节或8字节 根据精度p不同选择REAL或DOUBLE PRECISION作为内部表示。如不指定精度,内部用DOUBLE PRECISION表示。 BINARY_DOUBLE 是DOUBLE PRECISION的别名,为兼容Oracle类型。 8字节 -1.79E+308~1.79E+308,15位十进制数字精度。 DEC[(p[,s])] 精度p取值范围为[1,1000],标度s取值范围为[0,p]。 说明: p为总位数,s为小数位位数。 用户声明精度。每四位(十进制位)占用两个字节,然后在整个数据上加上八个字节的额外开销。 未指定精度的情况下,小数点前最大131,072位,小数点后最大16,383位。 INTEGER[(p[,s])] 精度p取值范围为[1,1000],标度s取值范围为[0,p]。 用户声明精度。每四位(十进制位)占用两个字节,然后在整个数据上加上八个字节的额外开销。 - 关于浮点类型的精度,目前只能保证直接读取时的精度位数。涉及分布式计算时,由于计算执行在各个DN节点上,并且最终汇聚到一个CN节点,因此误差可能会随计算节点数量增加而被放大。 示例: 1 2 3 4 5 6 7 8 9101112131415161718192021222324 --创建表。gaussdb=# CREATE TABLE float_type_t2 ( FT_COL1 INTEGER, FT_COL2 FLOAT4, FT_COL3 FLOAT8, FT_COL4 FLOAT(3), FT_COL5 BINARY_DOUBLE, FT_COL6 DECIMAL(10,4), FT_COL7 INTEGER(6,3))DISTRIBUTE BY HASH ( ft_col1);--插入数据。gaussdb=# INSERT INTO float_type_t2 VALUES(10,10.365456,123456.1234,10.3214, 321.321, 123.123654, 123.123654);--查看数据。gaussdb=# SELECT * FROM float_type_t2 ; ft_col1 | ft_col2 | ft_col3 | ft_col4 | ft_col5 | ft_col6 | ft_col7 ---------+---------+-------------+---------+---------+----------+--------- 10 | 10.3655 | 123456.1234 | 10.3214 | 321.321 | 123.1237 | 123.124(1 row)--删除表。gaussdb=# DROP TABLE float_type_t2; 父主题: 数据类型
  • 示例 1 2 3 4 5 6 7 8 910111213141516171819202122232425262728293031 --创建文本搜索配置。gaussdb=# CREATE TEXT SEARCH CONFIGURATION ngram2 (parser=ngram) WITH (gram_size = 2, grapsymbol_ignore = false);--创建文本搜索配置。gaussdb=# CREATE TEXT SEARCH CONFIGURATION ngram3 (copy=ngram2) WITH (gram_size = 2, grapsymbol_ignore = false);--添加类型映射。gaussdb=# ALTER TEXT SEARCH CONFIGURATION ngram2 ADD MAPPING FOR multisymbol WITH simple;--创建用户joe。gaussdb=# CREATE USER joe IDENTIFIED BY 'xxxxxxxxxxx';--修改文本搜索配置的所有者。gaussdb=# ALTER TEXT SEARCH CONFIGURATION ngram2 OWNER TO joe;--修改文本搜索配置的schema。gaussdb=# ALTER TEXT SEARCH CONFIGURATION ngram2 SET SCHEMA joe;--重命名文本搜索配置。gaussdb=# ALTER TEXT SEARCH CONFIGURATION joe.ngram2 RENAME TO ngram_2;--删除类型映射。gaussdb=# ALTER TEXT SEARCH CONFIGURATION joe.ngram_2 DROP MAPPING IF EXISTS FOR multisymbol;--删除文本搜索配置。gaussdb=# DROP TEXT SEARCH CONFIGURATION joe.ngram_2;gaussdb=# DROP TEXT SEARCH CONFIGURATION ngram3;--删除Schema及用户joe。gaussdb=# DROP SCHEMA IF EXISTS joe CASCADE;gaussdb=# DROP ROLE IF EXISTS joe;
  • 注意事项 若仅声明分析器,那么新的文本搜索配置初始没有从符号类型到词典的映射, 因此会忽略所有的单词。后面必须调用ALTER TEXT SEARCH CONFIGURATION命令创建映射使配置生效。如果声明了COPY选项,那么会自动拷贝指定的文本搜索配置的解析器、映射、配置选项等信息。 若模式名称已给出,那么文本搜索配置会在声明的模式中创建。否则会在当前模式创建。 定义文本搜索配置的用户成为其所有者。 PARSER和COPY选项是互相排斥的,因为当一个现有配置被复制,其分析器配置也被复制了。 若仅声明分析器,那么新的文本搜索配置初始没有从符号类型到词典的映射, 因此会忽略所有的单词。
  • 参数说明 name 要创建的文本搜索配置的名称。该名称可以有模式修饰。 parser_name 用于该配置的文本搜索分析器的名称。 source_config 要复制的现有文本搜索配置的名称。 configuration_option 文本搜索配置的配置参数,主要是针对parser_name执行的解析器,或者source_config隐含的解析器而言的。 取值范围:目前共支持default、ngram两种类型的解析器,其中default类型的解析器没有对应的configuration_option,ngram类型解析器对应的configuration_option如表1所示。 表1 ngram类型解析器对应的配置参数 解析器 配置参数 参数描述 取值范围 ngram gram_size 分词长度。 正整数,1~4 默认值:2 punctuation_ignore 是否忽略标点符号。 true(默认值):忽略标点符号。 false:不忽略标点符号。 grapsymbol_ignore 是否忽略图形化字符。 true:忽略图形化字符。 false(默认值):不忽略图形化字符。
  • 矩形 矩形是用一对对角点来表示的。用下面的语法描述box的值: ( ( x1 , y1 ) , ( x2 , y2 ) )( x1 , y1 ) , ( x2 , y2 )x1 , y1 , x2 , y2 (x1,y1)和(x2,y2)表示矩形的一对对角点,点的数值类型为float8类型。 矩形的输出使用第二种语法。 任何两个对角都可以出现在输入中,但按照那样的顺序,右上角和左下角的值会被重新排序以存储。 示例: gaussdb=# select box(point(1.1, 2.2), point(3.3, 4.4)); box--------------------- (3.3,4.4),(1.1,2.2)(1 row)
  • 多边形 多边形由一系列点代表(多边形的顶点)。多边形可以认为与闭合路径一样,但是存储方式不一样而且有自己的一套支持函数。 用下面的语法描述polygon的数值: ( ( x1 , y1 ) , ... , ( xn , yn ) )( x1 , y1 ) , ... , ( xn , yn )( x1 , y1 , ... , xn , yn )x1 , y1 , ... , xn , yn 点表示多边形的端点,点的数值类型为float8类型。 多边形输出使用第一种语法。 示例: gaussdb=# select polygon(box '((0,0),(1,1))'); polygon--------------------------- ((0,0),(0,1),(1,1),(1,0))(1 row)
  • 路径 路径由一系列连接的点组成。路径可能是开放的,也就是认为列表中第一个点和最后一个点没有连接,也可能是闭合的,这时认为第一个和最后一个点连接起来。 用下面的语法描述path的数值: [ ( x1 , y1 ) , ... , ( xn , yn ) ]( ( x1 , y1 ) , ... , ( xn , yn ) )( x1 , y1 ) , ... , ( xn , yn )( x1 , y1 , ... , xn , yn )x1 , y1 , ... , xn , yn 点表示组成路径的线段的端点,点的数值类型为float8类型。方括弧([])表明一个开放的路径,圆括弧(())表明一个闭合的路径。当最外层的括号被省略,如在第三至第五语法,会假定一个封闭的路径。 路径的输出使用第一种或第二种语法输出。 示例: gaussdb=# select path(polygon '((0,0),(1,1),(2,0))'); path--------------------- ((0,0),(1,1),(2,0))(1 row)
  • 线段 线段(lseg)是用一对点来代表的。用下面的语法描述lseg的数值: [ ( x1 , y1 ) , ( x2 , y2 ) ]( ( x1 , y1 ) , ( x2 , y2 ) )( x1 , y1 ) , ( x2 , y2 )x1 , y1 , x2 , y2 (x1,y1)和(x2,y2)表示线段的端点,点的数值类型为float8类型。 线段输出使用第一种语法。 示例: gaussdb=# select lseg(point(1.1, 2.2), point(3.3, 4.4)); lseg----------------------- [(1.1,2.2),(3.3,4.4)](1 row)
  • macaddr macaddr类型存储MAC地址,也就是以太网卡硬件地址(尽管MAC地址还用于其它用途)。可以接受下列格式: '08:00:2b:01:02:03''08-00-2b-01-02-03''08002b:010203''08002b-010203''0800.2b01.0203''08002b010203' 这些示例都表示同一个地址。对于数据位a到f,大小写都行。输出时都是以第一种形式展示。
  • cidr cidr(无类别域间路由,Classless Inter-Domain Routing)类型,保存一个IPv4网络地址。声明网络格式为address/y,address表示IPv4地址,y表示子网掩码的二进制位数。如果省略y,则掩码部分使用已有类别的网络编号系统进行计算,但要求输入的数据已经包括了确定掩码所需的所有字节。 表2 cidr类型输入举例 cidr输入 cidr输出 abbrev(cidr) 192.168.100.128/25 192.168.100.128/25 192.168.100.128/25 192.168/24 192.168.0.0/24 192.168.0/24 192.168/25 192.168.0.0/25 192.168.0.0/25 192.168.1 192.168.1.0/24 192.168.1/24 192.168 192.168.0.0/24 192.168.0/24 10.1.2 10.1.2.0/24 10.1.2/24 10.1 10.1.0.0/16 10.1/16 10 10.0.0.0/8 10/8 10.1.2.3/32 10.1.2.3/32 10.1.2.3/32
  • inet inet类型在一个数据区域内保存主机的IPv4地址,以及一个可选子网。主机地址中网络地址的位数表示子网(“子网掩码”)。如果子网掩码是32并且地址是IPv4,则这个值不表示任何子网,只表示一台主机。 该类型的输入格式是address/y,address表示IPv4地址,y是子网掩码的二进制位数。如果省略/y,则子网掩码对IPv4是32,所以该值表示只有一台主机。如果该值表示只有一台主机,/y将不会显示。 inet和cidr类型之间的基本区别是inet接受子网掩码,而cidr不接受。
  • 二进制类型 GaussDB支持的二进制类型请参见表1。 表1 二进制类型 名称 描述 存储空间 BLOB 二进制大对象 目前BLOB支持的外部存取接口仅为: DBE_LOB.GET_LENGTH DBE_LOB.READ DBE_LOB.WRITE DBE_LOB.WRITE_APPEND DBE_LOB.COPY DBE_LOB.ERASE 这些接口详细说明请参见DBE_LOB。 说明: 列存不支持BLOB类型 最大为1GB减去6字节(即1073741818字节)。 RAW 变长的十六进制类型 说明: 列存不支持RAW类型 最大为1GB减去6字节(即1073741818字节)。 BYTEA 变长的二进制字符串 最大为1GB减去(56+24+5+1+前n列总字节数)。比如表为(a int, b bytea); 最长存储为1GB – 56 – 24 -5 -1– 4(int) = 1073741735。 BYTEAWITHOUTORDERWITHEQUALCOL 变长的二进制字符串(密态特性新增的类型,如果加密列的加密类型指定为确定性加密,则该列的实际类型为BYTEAWITHOUTORDERWITHEQUALCOL),元命令打印加密表将显示原始数据类型 4字节加上实际的二进制字符串。最大为1GB减去53字节(即1073741771字节)。 BYTEAWITHOUTORDERCOL 变长的二进制字符串(密态特性新增的类型,如果加密列的加密类型指定为随机加密,则该列的实际类型为BYTEAWITHOUTORDERCOL),元命令打印加密表将显示原始数据类型 4字节加上实际的二进制字符串。最大为1GB减去53字节(即1073741771字节)。 _BYTEAWITHOUTORDERWITHEQUALCOL 变长的二进制字符串,密态特性新增的类型 4字节加上实际的二进制字符串。最大为1GB减去53字节(即1073741771字节)。 _BYTEAWITHOUTORDERCOL 变长的二进制字符串,密态特性新增的类型 4字节加上实际的二进制字符串。最大为1GB减去53字节(即1073741771字节)。 除了每列的大小限制以外,每个元组的总大小也不可超过1GB-53字节(即1073741771字节)。 不支持直接使用BYTEAWITHOUTORDERWITHEQUALCOL和BYTEAWITHOUTORDERCOL,_BYTEAWITHOUTORDERWITHEQUALCOL,_BYTEAWITHOUTORDERCOL类型创建表。 RAW(n),n是指字节长度建议值,不会用于校验输入raw类型的字节长度。 示例: 1 2 3 4 5 6 7 8 910111213141516171819202122 --创建表。gaussdb=# CREATE TABLE blob_type_t1 ( BT_COL1 INTEGER, BT_COL2 BLOB, BT_COL3 RAW, BT_COL4 BYTEA) DISTRIBUTE BY REPLICATION;--插入数据。gaussdb=# INSERT INTO blob_type_t1 VALUES(10,empty_blob(),HEXTORAW('DEADBEEF'),E'\\xDEADBEEF');--查询表中的数据。gaussdb=# SELECT * FROM blob_type_t1; bt_col1 | bt_col2 | bt_col3 | bt_col4 ---------+---------+----------+------------ 10 | | DEADBEEF | \xdeadbeef(1 row)--删除表。gaussdb=# DROP TABLE blob_type_t1; 父主题: 数据类型
  • 示例 --创建表。gaussdb=# CREATE TABLE char_type_t1 ( CT_COL1 CHARACTER(4))DISTRIBUTE BY HASH (CT_COL1);--插入数据。gaussdb=# INSERT INTO char_type_t1 VALUES ('ok');--查询表中的数据。gaussdb=# SELECT ct_col1, char_length(ct_col1) FROM char_type_t1; ct_col1 | char_length ---------+------------- ok | 4(1 row)--删除表。gaussdb=# DROP TABLE char_type_t1; 1 2 3 4 5 6 7 8 9101112131415161718192021222324252627282930 --创建表。gaussdb=# CREATE TABLE char_type_t2 ( CT_COL1 VARCHAR(5))DISTRIBUTE BY HASH (CT_COL1);--插入数据。gaussdb=# INSERT INTO char_type_t2 VALUES ('ok');gaussdb=# INSERT INTO char_type_t2 VALUES ('good');--插入的数据长度超过类型规定的长度报错。gaussdb=# INSERT INTO char_type_t2 VALUES ('too long');ERROR: value too long for type character varying(5)CONTEXT: referenced column: ct_col1--明确类型的长度,超过数据类型长度后会自动截断。gaussdb=# INSERT INTO char_type_t2 VALUES ('too long'::varchar(5));--查询数据。gaussdb=# SELECT ct_col1, char_length(ct_col1) FROM char_type_t2; ct_col1 | char_length ---------+------------- ok | 2 good | 4 too l | 5(3 rows)--删除数据。gaussdb=# DROP TABLE char_type_t2;
共100000条