云服务器内容精选

  • MySQL To GaussDB 数据类型转换说明 源数据库数据类型 转换后数据类型(GaussDB 8.0以前版本) 转换后数据类型(GaussDB 8.0及其以后版本) 相关的转换配置 CHAR CHAR CHAR 字符集长度转换 选择配置项的值为“扩展字符数据类型长度”,可与DRS转换后在GaussDB 存储等价。 VARCHAR VARCHAR VARCHAR 字符集长度转换 选择配置项的值为“扩展字符数据类型长度。”,可与DRS转换后在GaussDB 存储等价。 BINARY BYTEA BYTEA - VARBINARY BYTEA BYTEA - TINYBLOB BYTEA TINYBLOB - BLOB BLOB BLOB BLOB类型转换 选择配置项的值为“BLOB类型保持不变”,可与DRS转换后在GaussDB 存储等价。 MEDIUMBLOB BYTEA MEDIUMBLOB - LONGBLOB BYTEA LONGBLOB LONGBLOB类型转换 选择配置项的值为“迁移脚本,将LONGBLOB类型转换为BYTEA类型。”,可与DRS转换后在GaussDB 存储等价。 TINYTEXT TEXT TINYTEXT - TEXT TEXT TEXT TEXT数据类型转换 选择配置项的值为“不转换,保留TEXT数据类型,并注释长度”,可与DRS转换后在GaussDB 存储等价。 MEDIUMTEXT TEXT MEDIUMTEXT - LONGTEXT CLOB LONGTEXT LONGTEXT类型转换 选择配置项的值为“迁移脚本,将LONGTEXT类型转换为CLOB类型。”,可与DRS转换后在GaussDB 存储等价。 ENUM VARCHAR VARCHAR - SET SET SET - TINYINT SMALLINT TINYINT TINYINT类型转换 选择配置项的值为“转换TINYINT类型。”,可与DRS转换后在GaussDB 存储等价。 类型转换后是否添加CHECK约束 选择配置项的值为“不添加CHECK约束。”,可与DRS转换后在GaussDB 存储等价。 SMALLINT SMALLINT SMALLINT 无符号整数类型转换 选择配置项的值为“类型保持不变,不做转换”,可与DRS转换后在GaussDB 存储等价。 类型转换后是否添加CHECK约束 选择配置项的值为“不添加CHECK约束。”,可与DRS转换后在GaussDB 存储等价。 MEDIUMINT INTEGER MEDIUMINT 有符号整数类型转换 选择配置项的值为“类型保持不变,不做转换”,可与DRS转换后在GaussDB 存储等价。 无符号整数类型转换 选择配置项的值为“类型保持不变,不做转换”,可与DRS转换后在GaussDB 存储等价。 类型转换后是否添加CHECK约束 选择配置项的值为“不添加CHECK约束。”,可与DRS转换后在GaussDB 存储等价。 INT INT INT - BIGINT BIGINT BIGINT - FLOAT FLOAT4 FLOAT FLOAT类型转换 选择配置项的值为“类型转换为DOUBLE PRECISION,注释掉精度和标度,注释掉符号和填充关键字(UNSIGNED、SIGNED、ZEROFILL)”,可与DRS转换后在GaussDB 存储等价。 类型转换后是否添加CHECK约束 选择配置项的值为“不添加CHECK约束。”,可与DRS转换后在GaussDB 存储等价。 DOUBLE DOUBLE PRECISION DOUBLE DOUBLE类型转换 选择配置项的值为“类型转换为DOUBLE PRECISION,注释掉精度和标度,注释掉符号和填充关键字(UNSIGNED、SIGNED、ZEROFILL)”,可与DRS转换后在GaussDB 存储等价。 类型转换后是否添加CHECK约束 选择配置项的值为“不添加CHECK约束。”,可与DRS转换后在GaussDB 存储等价。 DATE DATE DATE - DATETIME TIMESTAMP DATETIME - TIMESTAMP TIMESTAMP WITH TIME ZONE TIMESTAMP - TIME TIME TIME - BIT BIT BIT - JSON JSONB JSONB json数据类型转换 选择配置项的值为“不转换,保留JSON数据类型。”,可与DRS转换后在GaussDB 存储等价。 YEAR SMALLINT SMALLINT 类型转换后是否添加CHECK约束 选择配置项的值为“不添加CHECK约束。”,可与DRS转换后在GaussDB 存储等价。 DECIMAL DECIMAL DECIMAL - NUMERIC NUMERIC NUMERIC - 父主题: 数据类型转换说明
  • 示例 插入的数据长度超过类型规定的长度的示例。 --创建表。 gaussdb=# CREATE TABLE char_type_t1 ( CT_COL1 CHARACTER(4) ); --插入数据。 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; --创建表。 gaussdb=# CREATE TABLE char_type_t2 ( CT_COL1 VARCHAR(5) ); --插入数据。 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; -- 示例:char和varchar类型。 -- 创建B兼容模式下的数据库。 gaussdb=# create database gaussdb_m with dbcompatibility 'b'; gaussdb=# \c gaussdb_m -- 设置兼容版本控制参数。 gaussdb_m=# set b_format_version='5.7'; gaussdb_m=# set b_format_dev_version='s1'; -- 创建表。 gaussdb_m=# create table t1(a char(5), b varchar(5)); -- 插入数据。 gaussdb_m=# insert into t1 values('一二三四五','一二三四五'); -- 查看数据。 gaussdb_m=# select char_length(a),char_length(b) from t1; char_length | char_length -------------+------------- 5 | 5 (1 row) gaussdb_m=# select length(a),length(b) from t1; length | length --------+-------- 15 | 15 (1 row) gaussdb_m=# select * from t1; a | b ------------+------------ 一二三四五 | 一二三四五 (1 row) -- 删除表。 gaussdb_m=# drop table t1; -- 示例:tinytext,mediumtext,longtext类型。 -- 创建表。 gaussdb_m=# create table t2(a tinytext, b mediumtext, c longtext); -- 插入数据。 gaussdb_m=# insert into t2 values('abcde','abcde','abcde'); -- 查看数据。 gaussdb_m=# select * from t2; a | b | c -------+-------+------- abcde | abcde | abcde (1 row) -- 删除表和数据库。 gaussdb_m=# drop table t2; gaussdb_m=# \c postgres; gaussdb=# drop database gaussdb_m; -- 重置参数。 gaussdb=# reset all; 变长类型最大存储长度说明示例。 此示例以varchar为例,varchar2/nvarchar/nvarchar2/text同理。 -- 创建表,表中有三列,分别为int、varchar、int,根据计算规则,varchar最大存储长度为1GB-85-4-4-4=1073741727。 gaussdb=# CREATE TABLE varchar_maxlength_test1 (a int, b varchar, c int); -- varchar为1073741728,超过规定长度,插入失败。 gaussdb=# insert into varchar_maxlength_test1 values(1, repeat('a', 1073741728), 1); ERROR: invalid memory alloc request size 1073741824 in tuplesort.cpp:219 -- varchar为1073741727,长度符合要求,插入成功。 gaussdb=# insert into varchar_maxlength_test1 values(1, repeat('a', 1073741727), 1); -- 创建表,表中仅varchar一列,根据计算规则,varchar最大存储长度为1GB-85-4=1073741735。 gaussdb=# CREATE TABLE varchar_maxlength_test2 (a varchar); -- varchar为1073741736,超过规定长度,插入失败。 insert into varchar_maxlength_test2 values(repeat('a', 1073741736)); ERROR: invalid memory alloc request size 1073741824 in tuplesort.cpp:219 -- varchar为1073741735,长度符合要求,插入成功。 insert into varchar_maxlength_test2 values(repeat('a', 1073741735));
  • 示例 插入的数据长度超过类型规定的长度的示例。 --创建表。 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 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 --创建表。 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; -- 示例:char和varchar类型。 -- 创建MYSQL兼容模式下的数据库。 gaussdb=# create database gaussdb_m with dbcompatibility 'MYSQL'; gaussdb=# \c gaussdb_m -- 设置兼容版本控制参数。 gaussdb_m=# set b_format_version='5.7'; gaussdb_m=# set b_format_dev_version='s1'; -- 创建表。 gaussdb_m=# create table t1(a char(5), b varchar(5)); -- 插入数据。 gaussdb_m=# insert into t1 values('一二三四五','一二三四五'); -- 查看数据。 gaussdb_m=# select char_length(a),char_length(b) from t1; char_length | char_length -------------+------------- 5 | 5 (1 row) gaussdb_m=# select length(a),length(b) from t1; length | length --------+-------- 15 | 15 (1 row) gaussdb_m=# select * from t1; a | b ------------+------------ 一二三四五 | 一二三四五 (1 row) -- 删除表。 gaussdb_m=# drop table t1; -- 示例:tinytext,mediumtext,longtext类型。 -- 创建表。 gaussdb_m=# create table t2(a tinytext, b mediumtext, c longtext); -- 插入数据。 gaussdb_m=# insert into t2 values('abcde','abcde','abcde'); -- 查看数据。 gaussdb_m=# select * from t2; a | b | c -------+-------+------- abcde | abcde | abcde (1 row) -- 删除表和数据库。 gaussdb_m=# drop table t2; gaussdb_m=# \c postgres; gaussdb=# drop database gaussdb_m; -- 重置参数。 gaussdb=# reset all; 变长类型最大存储长度说明示例。 此示例以varchar为例,varchar2/nvarchar/nvarchar2/text同理。 -- 创建表,表中有三列,分别为int、varchar、int,根据计算规则,varchar最大存储长度为1GB-85-4-4-4=1073741727。 gaussdb=# CREATE TABLE varchar_maxlength_test1 (a int, b varchar, c int) DISTRIBUTE BY HASH (a); -- varchar为1073741728,超过规定长度,插入失败。 gaussdb=# insert into varchar_maxlength_test1 values(1, repeat('a', 1073741728), 1); ERROR: invalid memory alloc request size 1073741824 in tuplesort.cpp:219 -- varchar为1073741727,长度符合要求,插入成功。 gaussdb=# insert into varchar_maxlength_test1 values(1, repeat('a', 1073741727), 1); -- 创建表,表中仅varchar一列,根据计算规则,varchar最大存储长度为1GB-85-4=1073741735。 gaussdb=# CREATE TABLE varchar_maxlength_test2 (a varchar) DISTRIBUTE BY HASH (a); -- varchar为1073741736,超过规定长度,插入失败。 insert into varchar_maxlength_test2 values(repeat('a', 1073741736)); ERROR: invalid memory alloc request size 1073741824 in tuplesort.cpp:219 -- varchar为1073741735,长度符合要求,插入成功。 insert into varchar_maxlength_test2 values(repeat('a', 1073741735));
  • 包含和排除边界 每一个非空范围都有两个界限:下界和上界。这些值之间的所有点都被包括在范围内。包含界限意味着边界点本身也被包括在范围内,而排除边界意味着边界点不被包括在范围内。 在范围的文本形式中,包含下界用“[”表示,排除下界用“(”表示。同样,包含上界用“]”表示,排除上界用“)”表示。 函数lower_inc(anyrange)和lower_inc(anyrange)分别测试一个范围值的上下界。
  • 无限(无界)范围 范围的下界可以省略,这意味着所有小于上界的值都包括在范围中,例如(,3]。同样,范围的上界被省略,则所有大于下界的值都包括在范围中。如果下界和上界都被省略,则该元素类型的所有值都被认为在范围内。如果缺失的边界指定为包含则自动将包含转换为排除,例如[,]将转换为(,)。可以将这些缺失的值视为+/-无穷大,但它们是特殊的范围类型值,并且被视为超出任何范围元素类型的+/-无穷大值。 具有“无穷大”概念的元素类型可以将其作为显式边界值。例如,在时间戳范围,[today,infinity)不包括特殊的timestamp值infinity,尽管[today,infinity]包括它,就好比 [today,)和[today,]。 函数lower_inf(anyrange)和upper_inf(anyrange)分别测试一个范围的无限上下界。
  • 范围的输入/输出 范围值的输入必须遵循下列模式之一: (lower-bound,upper-bound) (lower-bound,upper-bound] [lower-bound,upper-bound) [lower-bound,upper-bound] empty 圆括号或方括号指示上下界是否为排除的或者包含的。最后一个模式是empty,它表示一个空范围(一个不包含点的范围)。 lower-bound可以作为子类型的合法输入的一个字符串,或者是空,表示没有下界。同样,upper-bound可以是作为子类型的合法输入的一个字符串,或者是空,表示没有上界。 每个界限值可以使用双引号引用。如果界限值包含圆括号、方括号、逗号、双引号或反斜线时,则必须使用双引号引用,否则这些符号会被认作范围语法的一部分。要想把双引号或反斜线放在被引用的界限值中,需要在双引号或反斜线前面加一个反斜线(在双引号引用的界限值中的一对双引号表示一个双引号字符,这与SQL字符串中的单引号规则类似)。此外,可以避免引用并且使用反斜线转义来保护所有数据字符,否则它们会被当做返回语法的一部分。什么都不写则表示一个无限界限,因此,要表示空字符串的界限值,可以写成""。 范围值前后允许有空格,但是圆括号或方括号之间的任何空格会被当做上下界值的一部分(取决于元素类型,它可能是有意义的也可能是无意义的)。 示例 查询包括3,不包括7,并且包括3和7之间的所有点: SELECT '[3,7)'::int4range; int4range ----------- [3,7) (1 row) 查询既不包括3也不包括 7,但是包括之间的所有点: SELECT '(3,7)'::int4range; int4range ----------- [4,7) (1 row) 查询只包括单独一个点4: SELECT '[4,4]'::int4range; int4range ----------- [4,5) (1 row) 查询不包括点(并且将被标准化为 '空'): SELECT '[4,4)'::int4range; int4range ----------- empty (1 row)
  • 离散范围类型 离散范围是指其元素类型具有定义明确的“步长”的范围,如integer或date。在这些类型中,当两个元素之间没有有效值时,它们可以被说成是相邻。 离散范围类型的每个元素值都有一个明确的“下一个”或“上一个”值。这样就可以通过选择下一个或上一个元素值,在范围界限的包含和排除表达之间转换。例如,在整数范围类型中,[4,8]和(3,9)表示相同的值集合,但对于超过numeric的范围,情况并非如此。 离散范围类型应具有识别元素类型所需步长的规范函数。规范化函数负责将范围类型的等价值转换为具有相同的表示,特别是与包含或者排除界限一致。如果未指定规范化函数,则具有不同格式的范围将始终被视为不相等,即使它们实际上是表达相同的一组值。 内置范围类型int4range、int8range和daterange都使用规范形式,该形式包括下界并且排除上界,也就是[)。但是,用户定义的范围类型可以使用其他约定。
  • 构造范围 每一种范围类型都有一个与其同名的构造器函数。使用构造器函数比写一个范围文字常数更方便,因为它避免了对界限值的额外引用。构造器函数接受两个或三个参数。两个参数的形式以标准的形式构造一个范围(包含下界,排除上界),而三个参数的形式按照第三个参数指定的界限形式构造一个范围。第三个参数必须是下列字符串之一: “()”、 “(]”、 “[)”或者 “[]”。 例如: 完整形式是:下界、上界以及指示界限包含性/排除性的文本参数: SELECT numrange(1.0, 14.0, '(]'); numrange ------------ (1.0,14.0] (1 row) 如果第三个参数被忽略,则假定为 '[)': SELECT numrange(1.0, 14.0); numrange ------------ [1.0,14.0) (1 row) 尽管这里指定了'(]',单返回结果时该值将被转换成标准形式,因为int8range是一种离散范围类型: SELECT int8range(1, 14, '(]'); int8range ----------- [2,15) (1 row) 界限使用NULL导致范围是无界的: SELECT numrange(NULL, 2.2); numrange ---------- (,2.2) (1 row)
  • 序列整型 SMALLSERIAL,SERIAL和BIGSERIAL类型不是真正的类型,只是为在表中设置唯一标识而存在的概念。因此,创建一个整数字段,并且把它的缺省数值安排为从一个序列发生器读取。应用了一个NOT NULL约束以确保NULL不会被插入。在大多数情况下用户可能还希望附加一个UNIQUE或PRIMARY KEY约束避免意外地插入重复的数值。最后,将序列发生器从属于那个字段,这样当该字段或表被删除的时候也一并删除该序列。目前只支持在创建表时指定SERIAL列,不可以在已有的表中增加SERIAL列。另外临时表也不支持创建SERIAL列。因为SERIAL不是真正的类型,也不可以将表中存在的列类型转化为SERIAL。 表4 序列整型 名称 描述 存储空间 范围 SMALLSERIAL 二字节序列整型。 2字节 1 ~ 32,767 SERIAL 四字节序列整型。 4字节 1 ~ 2,147,483,647 BIGSERIAL 八字节序列整型。 8字节 1 ~ 9,223,372,036,854,775,807 示例: 创建带有序列类型的表。 1 CREATE TABLE smallserial_type_tab(a SMALLSERIAL); 插入数据。 1 INSERT INTO smallserial_type_tab VALUES(default); 再次插入数据。 1 INSERT INTO smallserial_type_tab VALUES(default); 查看数据。 1 2 3 4 5 6 SELECT * FROM smallserial_type_tab; a --- 1 2 (2 rows) 插入NULL值会报错。 1 2 INSERT INTO smallserial_type_tab VALUES(NULL); ERROR: dn_6001_6002: null value in column "a" violates not-null constraint
  • 任意精度型 NUMBER类型能够用于存储对于精度位数没有限制的数字,并且可以用于执行精确计算。当要求高精确度时,推荐使用这种类型来存储货币总量和其他类型的数量值。与整数类型相比,任意精度类型需要更大的存储空间,其存储效率、运算效率以及压缩比效果都要差一些。 NUMBER类型数值的范围是小数点右边部分的小数位数。NUMBER类型数值的精度是指整个数值包含的所有数字,也就是小数点左右两边的所有数字。所以,可以说数值23.1234的精度为6,范围是4。可以认为整数的范围是0。 使用Numeric/Decimal进行列定义时,建议指定该列的精度p(总位数)以及范围s(小数位数)。 如果数值的精度或者范围大于列的数据类型所声明的精度和范围,那么系统将会试图对这个值进行四舍五入。如果不能对数值进行四舍五入的处理来满足数据类型的限制,则会报错。 表2 任意精度型 名称 描述 存储空间 范围 NUMERIC[(p[,s])], DECIMAL[(p[,s])] 精度p取值范围为[1,1000],标度s取值范围为[0,p]。 用户声明精度。每四位(十进制位)占用两个字节,然后在整个数据上加上八个字节的额外开销。 未指定精度的情况下,小数点前最大131,072位,小数点后最大16,383位。 NUMBER[(p[,s])] NUMERIC类型的别名,为兼容Oracle数据类型。 用户声明精度。每四位(十进制位)占用两个字节,然后在整个数据上加上八个字节的额外开销。 未指定精度的情况下,小数点前最大131,072位,小数点后最大16,383位。 示例: 创建带有DECIMAL数值类型的表。 1 CREATE TABLE decimal_type_t1 (DT_COL1 DECIMAL(10,4)); 插入数据。 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)
  • 浮点类型 浮点类型属于非精确,可变精度的数值类型。实际上,这些类型通常是对于二进制浮点算术(分别是单精度和双精度)的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表示。 BINARY_DOUBLE 是DOUBLE PRECISION的别名,为兼容Oracle类型。 8字节 1E-307~1E+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]。 用户声明精度。每四位(十进制位)占用两个字节,然后在整个数据上加上八个字节的额外开销。 未指定精度的情况下,小数点前最大131,072位,小数点后最大16,383位。 示例: 创建带有浮点类型的表。 1 2 3 4 5 6 7 8 9 10 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); 插入数据。 1 INSERT INTO float_type_t2 VALUES(10,10.365456,123456.1234,10.3214, 321.321, 123.123654, 123.123654); 查看数据。 1 2 3 4 5 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)
  • 整数类型 TINYINT、SMALLINT、INTEGER、BINARY_INTEGER和BIGINT类型存储整个数值(不带有小数部分),也就是整数。如果尝试存储超出范围以外的数值将会导致错误。 常用的类型是INTEGER,一般只有取值范围确定不超过SMALLINT的情况下,才会使用SMALLINT类型。而只有在INTEGER的范围不够的时候才使用BIGINT,因为前者相对快得多。 表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、INTEGER、BIGINT类型数据的表。 1 2 3 4 5 6 7 CREATE TABLE int_type_t1 ( a TINYINT, b TINYINT, c INTEGER, d BIGINT ); 插入数据。 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)
  • 空串与NULL Oracle兼容模式下,不区分空串与NULL,执行语句查询或数据导入时会将空串处理为NULL。 由于空串默认被处理为NULL,那就不能使用 = '' 作为查询条件,也不能用is ''。虽然不会有语法错误,但是不会有结果集返回。正确的用法是is null,不等于就是is not null 。 示例: 创建表t4,指定其字段的字符类型。 1 CREATE TABLE t4 (a text); 向表t4插入数据,插入值中包含空串和NULL。 1 2 INSERT INTO t4 VALUES('abc'),(''),(null); INSERT 0 3 查询表t4中是否存在空值。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 SELECT a,a isnull FROM t4; a | ?column? -----+---------- | t | t abc | f (3 rows) SELECT a,a isnull FROM t4 WHERE a is null; a | ?column? ---+---------- | t | t (2 rows) TD与MySQL兼容模式下,区分空串与null。 TD兼容模式下示例: 1 2 3 4 5 SELECT '' is null , null is null; isnull | isnull --------+---------- f | t (1 rows) MySQL兼容模式下示例: 1 2 3 4 5 SELECT '' is null , null is null; isnull | isnull --------+---------- f | t (1 rows)
  • 长度 如果把一个字段定义为char(n)或者varchar(n), 代表该字段最大可容纳n个长度的数据。无论哪种类型,可设置的最大长度都不得超过10485760(即10MB)。 当数据长度超过指定的长度n时,会抛出错误"value too long"。也可通过指定数据类型,使超过长度的数据自动截断。 示例: 创建表t1,指定其字段的字符类型。 1 CREATE TABLE t1 (a char(5),b varchar(5)); 向表t1插入数据时超过指定的字节长度报错。 1 2 3 INSERT INTO t1 VALUES('bookstore','123'); ERROR: value too long for type character(5) CONTEXT: referenced column: a 向表t1插入数据并明确超过指定字节长度后自动截断。 1 2 3 4 5 6 7 8 INSERT INTO t1 VALUES('bookstore'::char(5),'12345678'::varchar(5)); INSERT 0 1 SELECT a,b FROM t1; a | b -------+------- books | 12345 (1 row)
  • 定长与变长 所有字符类型根据长度是否固定可以分为定长字符串与变长字符串两大类。 对于定长字符串,长度必须确定,如果不指定长度,则默认长度1;如果数据长度不足,会在尾部自动填充空格,用以存储和显示;但这部分填充的数据是无意义的,实际使用中会被忽略,如比较、排序或类型转换。 对于变长字符串,若指定长度,则为最大可存储数据长度;如果不指定长度,则认为该字段支持任意长度。 示例: 创建表t2,指定其字段的字符类型。 1 CREATE TABLE t2 (a char(5),b varchar(5)); 向表t2插入数据并查询字段a的字节长度。因建表时指定a的字符类型为char(5)且是定长字符串,长度不足,填充空格,所以查询的字节长度为5。 1 2 3 4 5 6 7 8 INSERT INTO t2 VALUES('abc','abc'); INSERT 0 1 SELECT a,lengthb(a),b FROM t2; a | lengthb | b -------+---------+----- abc | 5 | abc (1 row) 用函数转换后查询字段a的实际字节长度为3。 1 2 3 4 5 6 7 8 9 10 11 SELECT a = b from t2; ?column? ---------- t (1 row) SELECT cast(a as text) as val,lengthb(val) FROM t2; val | lengthb -----+--------- abc | 3 (1 row)