云服务器内容精选

  • 浮点类型 浮点类型属于非精确,可变精度的数值类型。实际上,这些类型通常是对于二进制浮点算术(分别是单精度和双精度)的IEEE标准754的具体实现,在一定范围内由特定的处理器,操作系统和编译器所支持。 表3 浮点类型 名称 描述 存储空间 范围 REAL, FLOAT4 单精度浮点数,不精准。 4字节 6位十进制数字精度。 DOUBLE PRECISION, FLOAT8 双精度浮点数,不精准。 8字节 1E-307~1E+308, 15位十进制数字精度。 FLOAT[(p)] 浮点数,不精准。精度p取值范围为[1,53]。 说明: p为精度,表示总位数。 4字节或8字节 根据精度p不同选择REAL或DOUBLE PRECISION作为内部表示。如不指定精度,内部用DOUBLE PRECISION表示。 DEC[(p[,s])] 精度p取值范围为[1,1000],标度s取值范围为[0,p]。 说明: p为总位数,s为小数位位数。 用户声明精度。每四位(十进制位)占用两个字节,然后在整个数据上加上八个字节的额外开销。 未指定精度的情况下,小数点前最大131,072位,小数点后最大16,383位。 INTEGER[(p[,s])] 精度p取值范围为[1,1000],标度s取值范围为[0,p]。 用户声明精度。每四位(十进制位)占用两个字节,然后在整个数据上加上八个字节的额外开销。 未指定精度的情况下,小数点前最大131,072位,小数点后最大16,383位。 示例: 创建带有浮点类型的表。 1 2 3 4 5 6 7 8 9 10 11 CREATE EXTERNAL TABLE float_type_t1 ( FT_COL1 REAL, FT_COL2 FLOAT4, FT_COL3 DOUBLE PRECISION, FT_COL4 FLOAT8, FT_COL5 FLOAT, FT_COL6 FLOAT(3), FT_COL7 DEC(10,4), FT_COL8 INTEGER(6,3) ) STORE AS orc; 插入数据。 1 INSERT INTO float_type_t1 VALUES (10.01, 10.3655, 123456.1234, 10.3214, 123.1237, 123.1237, 123.124, 125.123456); 查看数据。 1 2 3 4 5 6 SELECT * FROM float_type_t1; ft_col1 | ft_col2 | ft_col3 | ft_col4 | ft_col5 | ft_col6 | ft_col7 | ft_col8 ---------+---------+-------------+---------+----------+---------+----------+--------- 10.01 | 10.3655 | 123456.1234 | 10.3214 | 123.1237 | 123.124 | 123.1240 | 125.123 (1 row)
  • 整数类型 SMALLINT、INTEGER和BIGINT类型存储整个数值(不带有小数部分),也就是整数。如果尝试存储超出范围以外的数值将会导致错误。 常用的类型是INTEGER,一般只有取值范围确定不超过SMALLINT的情况下,才会使用SMALLINT类型。而只有在INTEGER的范围不够的时候才使用BIGINT,因为前者相对快得多。 表1 整数类型 名称 描述 存储空间 范围 SMALLINT 小范围整数,别名为INT2。 2字节 -32,768 ~ +32,767 INTEGER 常用的整数,别名为INT4。 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 示例: 创建带有SMALLINT、INTEGER、BIGINT类型数据的表。 1 2 3 4 5 6 7 CREATE EXTERNAL TABLE int_type_t1 ( a SMALLINT, b SMALLINT, c INTEGER, d BIGINT ) STORE AS orc; 插入数据。 1 INSERT INTO int_type_t1 VALUES(100, 10, 1000, 10000); 查看数据。 1 2 3 4 5 SELECT * FROM int_type_t1; a | b | c | d -----+----+------+------- 100 | 10 | 1000 | 10000 (1 row)
  • 任意精度型 使用Numeric/Decimal进行列定义时,建议指定该列的精度p(总位数)以及范围s(小数位数)。 如果数值的精度或者范围大于列的数据类型所声明的精度和范围,那么系统将会试图对这个值进行四舍五入。如果不能对数值进行四舍五入的处理来满足数据类型的限制,则会报错。 表2 任意精度型 名称 描述 存储空间 范围 NUMERIC[(p[,s])], DECIMAL[(p[,s])] 精度p取值范围为[1,1000],标度s取值范围为[0,p]。 用户声明精度。每四位(十进制位)占用两个字节,然后在整个数据上加上八个字节的额外开销。 未指定精度的情况下,小数点前最大131,072位,小数点后最大16,383位。 示例: 创建带有DECIMAL数值类型的表。 1 CREATE EXTERNAL TABLE decimal_type_t1 (DT_COL1 DECIMAL(10,4)) STORE AS orc; 插入数据。 1 2 INSERT INTO decimal_type_t1 VALUES(123456.122331); INSERT INTO decimal_type_t1 VALUES(123456.452399); 查看数据。 1 2 3 4 5 6 SELECT * FROM decimal_type_t1; dt_col1 ------------- 123456.1223 123456.4524 (2 rows)
  • 隐式转换支持范围 Fabric SQL当前对于存储格式为orc或parquet的表类型,支持数值类型的隐式转换,即存储空间字节数多的类型向下兼容存储空间字节数少的类型。 例如实际存储为orc::SHORT(2字节),建表类型为SMALLINT、INT、BIGINT时都可以正常查询,Fabric SQL当前支持的隐式转换范围如下表所示。 表1 Fabric SQL数值类型隐式转换支持范围 Fabric数值类型隐式转换 SMALLINT INT BIGINT FLOAT4 FLOAT8 NUMERIC orc::byte/parquet::INT8 to √ √ √ × × × orc::short/parquet::INT16 to √ √ √ × × × orc::int/parquet::INT32 to × √ √ × × × orc::long/parquet::INT64 to × × √ × × × orc::float/parquet::32 to × × × √ × × orc::double/parquet::64 to × × × × √ × orc::decimal/parquet::decimal to × × × × × √ 父主题: 数据类型
  • PostgreSQL To GaussDB 数据类型转换 源数据库数据类型 转换后数据类型 相关的转换配置 SMALLINT SMALLINT - INTEGER INTEGER - BIGINT BIGINT - INTEGER INTEGER - REAL REAL - DOUBLE PRECISION DOUBLE PRECISION - NUMERIC NUMERIC - CHARACTER VARYING CHARACTER VARYING 字符数据类型转换 选择配置项的值为“扩展字符数据类型char/varchar长度。”,可与DRS转换后在GaussDB 存储等价。 CHARACTER CHARACTER 字符数据类型转换 选择配置项的值为“扩展字符数据类型char/varchar长度。”,可与DRS转换后在GaussDB 存储等价。 BIT BIT - BIT VARYING BIT VARYING - BOOLEAN BOOLEAN - BYTEA BYTEA - TEXT TEXT - TIME WITHOUT TIME ZONE TIME WITHOUT TIME ZONE - TIME WITH TIME ZONE TIME WITH TIME ZONE - TIMESTAMP WITHOUT TIME ZONE TIMESTAMP WITHOUT TIME ZONE - TIMESTAMP WITH TIME ZONE TIMESTAMP WITH TIME ZONE - INTERVAL INTERVAL - CIDR CIDR - PATH PATH - BOX BOX - LSEG LSEG - MACADDR MACADDR - POINT POINT - POLYGON POLYGON - INET INET - TSQUERY TSQUERY - TSVECTOR TSVECTOR - UUID UUID - JSON JSON - JSONB JSONB - 父主题: 数据类型转换
  • 类型对照 表1 空间数据类型对照表 MySQL空间数据类型 MySQL INPUT GaussDB(DWS) OUTPUT GEOMETRY GEOMETRY GEOMETRY POINT POINT POINT LINESTRING LINESTRING POLYGON POLYGON POLYGON POLYGON MULTIPOINT MULTIPOINT BOX MULTILINESTRING MULTILINESTRING BOX MULTIPOLYGON MULTIPOLYGON POLYGON GEOMETRYCOLLECTION GEOMETRYCOLLECTION CIRCLE GEOMETRY可以存储任何类型的几何值。其他单值类型(POINT, LINESTRING和POLYGON)将其值限制为特定的几何类型。 GEOMETRYCOLLECTION可以存储任何类型的对象的集合。其他集合类型(MULTIPOINT, MULTILINESTRING, MULTIPOLYGON,和 GEOMETRYCOLLECTION)限制集合成员像那些具有特定的几何形状的类型。 输入示例 1 2 3 4 5 6 7 8 9 10 11 12 13 CREATE TABLE `t_geo_test2` ( `id` int(11) NOT NULL, `name` varchar(255), `geometry_1` geometry NOT NULL, `point_1` point NOT NULL, `linestring_1` linestring NOT NULL, `polygon_1` polygon NOT NULL, `multipoint_1` multipoint NOT NULL, `multilinestring_1` multilinestring NOT NULL, `multipolygon_1` multipolygon NOT NULL, `geometrycollection_1` geometrycollection NOT NULL, PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB; 输出示例 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 CREATE TABLE "public"."t_geo_test2" ( "id" INTEGER(11) NOT NULL, "name" VARCHAR(255), "geometry_1" GEOMETRY NOT NULL, "point_1" POINT NOT NULL, "linestring_1" POLYGON NOT NULL, "polygon_1" POLYGON NOT NULL, "multipoint_1" BOX NOT NULL, "multilinestring_1" BOX NOT NULL, "multipolygon_1" POLYGON NOT NULL, "geometrycollection_1" CIRCLE NOT NULL, PRIMARY KEY ("id") ) WITH ( ORIENTATION = ROW, COMPRESSION = NO ) NOCOMPRESS DISTRIBUTE BY HASH ("id");
  • 示例 显示用字母t和f输出Boolean值。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 --创建表。 gaussdb=# CREATE TABLE bool_type_t1 ( BT_COL1 BOOLEAN, BT_COL2 TEXT ); --插入数据。 gaussdb=# INSERT INTO bool_type_t1 VALUES (TRUE, 'sic est'); gaussdb=# INSERT INTO bool_type_t1 VALUES (FALSE, 'non est'); --查看数据。 gaussdb=# SELECT * FROM bool_type_t1; bt_col1 | bt_col2 ---------+--------- t | sic est f | non est (2 rows) gaussdb=# SELECT * FROM bool_type_t1 WHERE bt_col1 = 't'; bt_col1 | bt_col2 ---------+--------- t | sic est (1 row) --删除表。 gaussdb=# DROP TABLE bool_type_t1;
  • inet inet类型在一个数据区域内保存主机的IPv4或IPv6地址,以及一个可选子网。主机地址中网络地址的位数表示子网(“子网掩码”)。如果子网掩码是32并且地址是IPv4,则这个值不表示任何子网,只表示一台主机。在IPv6里,地址长度是128位,因此128位表示唯一的主机地址。 该类型的输入格式是address/y,address表示IPv4或者IPv6地址,y是子网掩码的二进制位数。如果省略/y,则子网掩码对IPv4是32,对IPv6是128,所以该值表示只有一台主机。如果该值表示只有一台主机,/y将不会显示。 inet和cidr类型之间的基本区别是inet接受子网掩码,而cidr不接受。
  • 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或IPv6网络地址。声明网络格式为address/y,address表示IPv4或者IPv6地址,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 2001:4f8:3:ba::/64 2001:4f8:3:ba::/64 2001:4f8:3:ba::/64 2001:4f8:3:ba:2e0:81ff:fe22:d1f1/128 2001:4f8:3:ba:2e0:81ff:fe22:d1f1/128 2001:4f8:3:ba:2e0:81ff:fe22:d1f1 ::ffff:127.0.0.0/120 ::ffff:127.0.0.0/120 ::ffff:127.0.0.0/120 ::ffff:127.0.0.0/128 ::ffff:127.0.0.0/128 ::ffff:127.0.0.0/128
  • 数组构造器 数组构造器是一个能构建数组值的表达式。简单的数组构造器由关键词ARRAY、“[”、用于数组元素值的表达式列表(用逗号分隔)以及最后的“]”组成。示例如下: gaussdb=# SELECT ARRAY[1, 2, 3 + 4]; array --------- {1,2,7} (1 row) 默认情况下,数组的元素类型是成员表达式的公共类型,使用与UNION或CASE结构(详情请参见UNION,CASE和相关构造)相同的规则决定。可以通过显式类型转换将数组构造为所需的数据类型,示例如下: gaussdb=# SELECT ARRAY[1, 2, 3]::varchar[]; array --------- {1,2,3} (1 row) gaussdb=# SELECT ARRAY['a', 'b', 'c']; array --------- {a,b,c} (1 row) gaussdb=# SELECT ARRAY['a', 'b', 'c']::int[]; ERROR: invalid input syntax for integer: "a" LINE 1: select ARRAY['a', 'b', 'c']::int[]; ^ CONTEXT: referenced column: array gaussdb=# SELECT ARRAY[1::int, 'b', 'c']; ERROR: invalid input syntax for integer: "b" LINE 1: select ARRAY[1::int, 'b', 'c']; ^ CONTEXT: referenced column: array 除预置的基础类型外,record类型和表类型也可以定义其数组类型,示例: gaussdb=# CREATE TYPE rec IS (c1 int, c2 int); gaussdb=# SELECT ARRAY[(1, 1), (2, 2)]::rec[]; array ------------------- {"(1,1)","(2,2)"} (1 row) gaussdb=# SELECT ARRAY[rec(1, 1), rec(2, 2)]; array ------------------- {"(1,1)","(2,2)"} (1 row) gaussdb=# CREATE TABLE tab (c1 int, c2 int); gaussdb=# SELECT ARRAY[(1, 1), (2, 2)]::tab[]; array ------------------- {"(1,1)","(2,2)"} (1 row) gaussdb=# DROP TYPE rec; gaussdb=# DROP TABLE tab; 因为数组必须得有类型,因此在构造一个空数组时,必须明确的将其构造成需要的类型,示例: gaussdb=# SELECT ARRAY[]::int[]; array ------- {} (1 row) 也可以从子查询的结果中构造一个数组。此时, 数组构造器是关键字ARRAY后跟着用圆括号括起来的子查询,子查询必须只返回一个单独的字段。生成的一维数组将为子查询里每行结果生成一个元素, 元素类型匹配子查询的输出字段。示例: gaussdb=# SELECT ARRAY(select generate_series(1, 6)); array --------------- {1,2,3,4,5,6} (1 row) 多维数组值可以通过嵌套数组构造器的方法来制作。内层构造器中的ARRAY关键字可以省略。比如,下面两个示例是同样的结果: gaussdb=# SELECT ARRAY[ARRAY[1,2], ARRAY[3,4]]; array --------------- {{1,2},{3,4}} (1 row) gaussdb=# SELECT ARRAY[[1,2], [3,4]]; array --------------- {{1,2},{3,4}} (1 row) 同层的内层构造器必须生成同维的子数组。 任何应用于外层ARRAY构造器的类型转换自动的应用到所有的内层构造器。
  • 数组类型的字符串输入 要把一个数组值写成一个文字常数(常量输入),将元素值用花括号包围并用逗号分隔。因此,一个数组常量的一般格式如下: '{ val1 delim val2 delim ... }' 上述格式中的delim是元素类型的分隔符,记录在类型的pg_type表的typdelim列中。每个val可以是数组元素类型的一个常量,也可以是一个子数组。示例如下: gaussdb=# SELECT '{1, 2, 3}'::int[] AS RESULT; result --------- {1,2,3} (1 row) gaussdb=# SELECT '{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'::int[] AS RESULT; result --------------------------- {{1,2,3},{4,5,6},{7,8,9}} (1 row) 在任意元素值周围可以使用双引号,并且在元素值包含逗号或花括号等一些特殊字符时必须使用双引号。示例如下: gaussdb=# SELECT '{" ", "NULL", null, "\\", "{", "}", ","}'::varchar[] AS RESULT; result ------------------------------------ {" ","NULL",NULL,"\\","{","}",","} (1 row) -- 该示例表示有一个varchar类型的数组,且一共有7个varchar元素,元素依次为: 1、包含一个空格的字符串 2、值为“NULL”的字符串 3、字符串为NULL 4、有一个\字符的字符串 5、有一个{字符的字符串 6、有一个}字符的字符串 7、有一个,字符的字符串 对于数组字符串常量输入,如果数组元素值是空字符串或者包含花括号、分隔符、双引号、反斜杠、空白或者匹配关键字NULL。则这些元素输入需要使用双引号,在元素值里包含的双引号和反斜杠时需要额外添加一个反斜杠。 关键字NULL不区分大小写。 输入会自动跳过没有使用双引号的空白。 一般不建议使用字符常量的方式构造数组数据,推荐使用ARRAY构造器。
  • 数组类型的定义 一个数组数据类型一般通过在数组元素的数据类型名称后面加上方括号([])来命名。 示例一,创建一个名为sal_emp的表,它有一个表示雇员姓名类型为text的列(name),一个表示雇员季度工资的数组且元素类型为integer的列(pay_by_quarter),一个表示雇员手机号码的数组且元素类型为varchar(11)的列(phone_numbers): gaussdb=# CREATE TABLE sal_emp ( name text, pay_by_quarter integer[], phone_numbers varchar(11)[] gaussdb=# ); gaussdb=# DROP TABLE sal_emp; 示例二,其他方式定义一个数组类型,具体定义方法和定义行为参考示例中的注释: gaussdb=# CREATE TABLE sal_emp ( name text, pay_by_quarter1 integer[][], -- int类型的二维数组 pay_by_quarter2 integer[3], -- int类型的一维数组,尺寸大小为3 pay_by_quarter3 integer[3][3], -- int类型的二维数组,每一维尺寸大小为3 pay_by_quarter4 integer ARRAY, -- int类型的一维数组 pay_by_quarter5 integer ARRAY[3] -- int类型的一维数组,尺寸大小为3 ); gaussdb=# DROP TABLE sal_emp; 数组的维数定义功能并不生效(不影响运行时的行为),建议采用示例一的方式定义数组类型,并且不建议使用多维数组数据。 数组的尺寸定义功能并不生效(不影响运行时的行为),建议采用示例一的方式定义数组类型。 允许的数组数据维数最大为6。 数组元素个数限制如下: 元素个数最大为134217727个。 所有元素加起来最大存储空间不超过1GB - 1字节即1073741823字节。
  • 数组类型的使用 数组类型的使用示例如下: -- 创建有数组类型列的表,并插入一些数据 gaussdb=# CREATE TABLE orders ( name varchar, items varchar[] ); gaussdb=# INSERT INTO orders VALUES('a', ARRAY['苹果', '橘子', '梨']); gaussdb=# INSERT INTO orders VALUES('b', ARRAY['矿泉水', '可乐', '雪碧']); gaussdb=# INSERT INTO orders VALUES('c', ARRAY['鼠标', '键盘', '耳机']); gaussdb=# INSERT INTO orders VALUES('d', '{白菜, 土豆, 茄子}'); -- 查询数据 gaussdb=# SELECT * FROM orders ORDER BY name; name | items ------+-------------------- a | {苹果,橘子,梨} b | {矿泉水,可乐,雪碧} c | {鼠标,键盘,耳机} d | {白菜,土豆,茄子} (4 rows) -- 访问数组元素 gaussdb=# SELECT items[1] FROM orders ORDER BY name; items -------- 苹果 矿泉水 鼠标 白菜 (4 rows) -- 访问元素超过范围或者访问下标为NULL时会返回NULL gaussdb=# SELECT items[4] FROM orders ORDER BY name; items ------- (4 rows) gaussdb=# SELECT items[null] FROM orders ORDER BY name; items ------- (4 rows) -- 访问子数组 gaussdb=# SELECT items[1:2] FROM orders ORDER BY name; items --------------- {苹果,橘子} {矿泉水,可乐} {鼠标,键盘} {白菜,土豆} (4 rows) -- 更新整个数组 gaussdb=# UPDATE orders SET items = ARRAY['香蕉', '西瓜', '草莓'] WHERE name = 'a'; gaussdb=# SELECT items FROM orders WHERE name = 'a'; items ------------------ {香蕉,西瓜,草莓} (1 row) -- 更新数组的元素 gaussdb=# UPDATE orders SET items[1] = '芒果' WHERE name = 'a'; gaussdb=# SELECT items FROM orders WHERE name = 'a'; items ------------------ {芒果,西瓜,草莓} (1 row) -- 更新数组的元素片段 gaussdb=# UPDATE orders SET items[1:2] = ARRAY['电脑', '手机'] WHERE name = 'c'; gaussdb=# SELECT items FROM orders WHERE name = 'c'; items ------------------ {电脑,手机,耳机} (1 row) -- 添加数组元素,所有位于原数组最后一个元素和这个新元素之间的未赋值元素都将设为NULL gaussdb=# UPDATE orders SET items[4] = '显示器' WHERE name = 'c'; gaussdb=# SELECT items FROM orders WHERE name = 'c'; items ------------------------- {电脑,手机,耳机,显示器} (1 row) gaussdb=# UPDATE orders SET items[6] = '显示器2' WHERE name = 'c'; gaussdb=# SELECT items FROM orders WHERE name = 'c'; items -------------------------------------- {电脑,手机,耳机,显示器,NULL,显示器2} (1 row)
  • 数组类型的字符串输出 一个数组值的输出表现形式由该数组元素类型的输出再加上一些标明该数组结构的修饰组成。这些修饰由围绕在数组值周围的花括号(“{ ”和“}”)加上相邻项之间的分隔字符组成。在多维数组里, 每个维都有自己级别的花括号,并且在同级相邻的花括号项之间包含分隔符。 数组类型数据包含特殊字符(下述说明中的字符),字符串输出示例: gaussdb=# SELECT ARRAY['{', '}', 'hello, world', '"', '\', ' ', NULL] AS RESULT; array ---------------------------------------------- {"{","}","hello, world","\"","\\"," ",NULL} (1 row) 对于数组字符串常量输出,如果数组元素值是空字符串或者包含花括号、分隔符、双引号、反斜杠、空白或者元素为NULL,则这些元素输出时会输出双引号中,双引号和反斜杠则会被反斜杠转义额外输出一个反斜杠。与字符串常量输入相对应。