云服务器内容精选

  • 货币类型 货币类型存储带有固定小数精度的货币金额。 表1中显示的范围假设有两位小数。可以以任意格式输入,包括整型、浮点型或者典型的货币格式(如“$1,000.00”)。根据区域字符集,输出一般是最后一种形式。 表1 货币类型 名称 描述 存储空间 范围 money 货币金额 8 字节 -92233720368547758.08 ~ +92233720368547758.07 numeric、int和bigint类型的值可以转换为money类型。如果从real和double precision类型转换到money类型,可以先转换为numeric类型,再转换为money类型,例如: 1 2 3 4 5 gaussdb=# SELECT '12.34'::float8::numeric::money; money -------- $12.34 (1 row) 这种用法是不推荐使用的。浮点数不应该用来处理货币类型,因为小数点的位数可能会导致错误。 money类型的值可以转换为numeric类型而不丢失精度。转换为其他类型可能丢失精度,并且必须通过以下两步来完成: 1 2 3 4 5 gaussdb=# SELECT '52093.89'::money::numeric::float8; float8 ---------- 52093.89 (1 row) 当一个money类型的值除以另一个money类型的值时,结果是double precision(也就是,一个纯数字,而不是money类型);在运算过程中货币单位相互抵消。 父主题: 数据类型
  • 伪类型 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 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 --创建表。 gaussdb=# CREATE TABLE t1 (a int); --插入两条数据。 gaussdb=# INSERT INTO t1 values(1),(2); --创建函数showall()。 gaussdb=# CREATE OR REPLACE FUNCTION showall() RETURNS SETOF record AS $$ SELECT count(*) from t1; $$ LANGUAGE SQL; --调用函数showall()。 gaussdb=# SELECT showall(); showall --------- (2) (1 row) --删除函数。 gaussdb=# DROP FUNCTION showall(); --删除表。 gaussdb=# DROP TABLE t1; 父主题: 数据类型
  • 向量类型的使用 向量类型的使用示例如下: -- 创建含向量类型的表,同时设定数据维度。建表时向量类型必须要指定维度。 gaussdb=# CREATE TABLE t1(id int unique, repr floatvector(4)); gaussdb=# CREATE TABLE t2(id int unique, repr boolvector(3)); -- 插入数据 gaussdb=# INSERT INTO t1 VALUES(0, '[30,12,12,25]'); gaussdb=# INSERT INTO t2 VALUES(1, '[1, 0, 1]');
  • 账本数据库使用的数据类型 账本数据库使用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] 父主题: 数据类型
  • 路径 路径由一系列连接的点组成。路径可能是开放的,即列表中第一个点和最后一个点没有连接。路径也可能是闭合的,即列表中第一个点依次连接到最后一个点。 用下面的语法描述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)
  • 矩形 矩形是用一对对角点来表示的。用下面的语法描述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)
  • 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} a0eebc999c0b4ef8bb6d6bb9bd380a11 a0ee-bc99-9c0b-4ef8-bb6d-6bb9-bd38-0a11 一般是以标准格式输出。 父主题: 数据类型
  • 范围输入/输出 范围输入模式: (lower-bound,upper-bound) (lower-bound,upper-bound] [lower-bound,upper-bound) [lower-bound,upper-bound] empty 范围输出模式: [lower-bound,upper-bound) empty ()或[]指示上下界是否为排除的或者包含的。empty表示一个空范围(一个不包含点的范围)。 lower-bound可以是作为subtype的合法输入的一个字符串,或者是空(表示没有下界)。同样,upper-bound可以是作为subtype的合法输入的一个字符串,或者是空(表示没有上界)。 每个界限值可以使用"(双引号)字符引用。如果界限值包含圆括号、方括号、逗号、双引号或反斜线时,必须使用双引号进行引用,否则这些字符会被认作范围语法的一部分。要把一个双引号或反斜线放在一个被引用的界限值中,需在其前面添加一个反斜线(还有,在一个双引号引用的界限值中的一对双引号表示一个双引号字符,这与SQL字符串中的单引号规则类似)。此外,避免引用或者使用反斜线转义来保护所有数据字符,否则数据字符会被当作范围语法的一部分。如果要写一个是空字符串的界限值,则可以写成"",因为什么都不写表示一个无限界限。 范围值前后允许有空格,但是圆括号或方括号之间的任何空格会被当做上下界值的一部分(取决于元素类型,它可能是也可能不是有意义的)。 例子: --包括3,不包括7之间的所有点。 gaussdb=# SELECT '[3,7)'::int4range; int4range ----------- [3,7) (1 row) --既不包括3也不包括7之间的所有点。 gaussdb=# SELECT '(3,7)'::int4range; int4range ----------- [4,7) (1 row) --只包括单独一个点4。 gaussdb=# SELECT '[4,4]'::int4range; int4range ----------- [4,5) (1 row) --不包括点(并且将被标准化为 '空')。 gaussdb=# SELECT '[4,4)'::int4range; int4range ----------- empty (1 row)
  • 离散范围类型 一种范围的元素类型具有一个定义的“步长”,例如integer或date。在这些类型中,如果两个元素之间没有合法值,它们可以被说成是相邻。这与连续范围相反,连续范围中总是(或者几乎总是)可以在两个给定值之间标识其他元素值。例如,numeric类型之上的一个范围就是连续的,timestamp上的范围也是(尽管timestamp具有有限的精度,并且在理论上可以被当作离散的,但是可以认为它是连续的,因为通常并不关心它的步长)。 另一种考虑离散范围类型的方法是对每一个元素值都有一个清晰的“下一个”或“上一个”值。通过选择原来给定的下一个或上一个元素值来取代它,就可以在一个范围界限的包含和排除表达之间转换。例如,在一个整数范围类型中,[4,8]和(3,9)表示相同的值集合,但是对于numeric上的范围就不是这样。 一个离散范围类型应该具有一个正规化函数,即明确元素类型的指定步长。正规化函数负责把范围类型的相等值转换成具有相同的表达,特别是与包含或者排除界限一致。如果没有指定一个正规化函数,那么具有不同格式的范围将总是会被当作不等,即使它们实际上是表达相同的一组值。 内建的范围类型int4range、int8range和daterange都使用一种正规的形式,该形式包括下界并且排除上界,即[)。但是用户定义的范围类型可以使用其他形式。
  • 无限(无界)范围 一个范围的下界可以被忽略,意味着所有小于上界的值都被包括在范围中。 同样,如果范围的上界被忽略,那么所有比下界大的值都被包括在范围中。如果上下界都被忽略,该元素类型的所有值都被认为在该范围中。 当不设置范围的上界和下界时, 即上界为正无穷大,下界为负无穷大,该范围为无限(无界)范围。 具有infinity概念的元素类型可以作为显式边界值。 例如,在时间戳范围[today,infinity)和[today,infinity] ,[today,infinity)表示不包括特殊的timestamp值infinity,[today,infinity]表示包括特殊的timestamp值infinity。 函数lower_inf和upper_inf分别测试一个范围的无限上下界。
  • 构造范围 每一种范围类型都有一个与其同名的构造器函数。使用构造器函数常常比写一个范围文字常数更方便,因为它避免了对界限值的额外引用。构造器函数接收两个或三个参数。两个参数的形式以标准的形式构造一个范围(下界是包含的,上界是排除的),而三个参数的形式按照第三个参数指定的界限形式构造一个范围。第三个参数必须是下列字符串之一: “()”、 “(]”、 “[)”或者 “[]”。 --完整形式是:下界、上界以及指示界限包含性/排除性的文本参数。 gaussdb=# SELECT numrange(1.0, 14.0, '(]'); numrange ------------ (1.0,14.0] (1 row) --如果第三个参数被忽略,则假定为 '[)'。 gaussdb=# SELECT numrange(1.0, 14.0); numrange ------------ [1.0,14.0) (1 row) --尽管这里指定了 '(]',显示时该值将被转换成标准形式,因为int8range是一种离散范围类型。 gaussdb=# SELECT int8range(1, 14, '(]'); int8range ----------- [2,15) (1 row) --为一个界限使用NULL导致范围在那一边是无界的。 gaussdb=# SELECT numrange(NULL, 2.2); numrange ---------- (,2.2) (1 row)
  • 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)
  • aclitem类型 aclitem数据类型用于存储对象权限信息。其内部实现是int类型,支持的格式为‘user1=privs/user2’。 aclitem[]数据类型为aclitem组成的数组,支持的格式为‘{user1=privs1/user3,user2=privs2/user3}’。 其中user1、user2和user3为数据库中已存在的用户/角色名,privs为数据库中支持的权限(具体请参见表2)。 示例: --创建相应用户。 gaussdb=# CREATE USER user1 WITH PASSWORD '***********'; gaussdb=# CREATE USER user2 WITH PASSWORD '***********'; gaussdb=# CREATE USER omm WITH PASSWORD '***********'; --新建一张数据表table_acl,有三个字段,类型分别为int、aclitem、aclitem[]。 gaussdb=# CREATE TABLE table_acl (id int,priv aclitem,privs aclitem[]); --向数据表table_acl插入一条内容为(1,'user1=arw/omm','{omm=d/user2,omm=w/omm}')的数据。 gaussdb=# INSERT INTO table_acl VALUES (1,'user1=arw/omm','{omm=d/user2,omm=w/omm}'); --向数据表table_acl再插入一条内容为(2,'user1=aw/omm','{omm=d/user2}')的数据。 gaussdb=# INSERT INTO table_acl VALUES (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=# DROP USER user1; gaussdb=# DROP USER user2; gaussdb=# DROP USER omm; gaussdb=# DROP TABLE table_acl; 父主题: 数据类型