GBase 8a 支持 SQL92 中定义的大多数数据类型,同时也支持 SQL99 和 SQL2000 中定义的数据类型。 GBase 8a 支持的数据类型,如下所示:
1.数值类型
1.GBase 8a 支持数据类型包括严格的数值数据类型(TINYINT,INT,BIGINT, DECIMAL),以及近似的数值数据类型(FLOAT,DOUBLE)。 为了更有效地使用存储空间,请用户尽量使用最精确的类型。例如,如果 一个整数列被用于在 1~127 之间的值,TINYINT 是最好的类型。 为了存储更大范围的数值,用户可以选择 BIGINT 或 DECIMAL 类型。 作为 SQL92 标准的扩展,GBase 8a 也支持整数类型 TINYINT,SMALLINT 和 BIGINT。
1.1TINYINT 整数类型,TINYINT 范围是-127 到 127。TINYINT 占用 1 个字节。
1.2 SMALLINT 整数类型。SMALLINT 范围是-32767 到 32767。SMALLINT 占用 2 个字节。
1.3 INT 整数类型。INTEGER 的同义词。INT 范围是-2147483647 到 2147483647。 INT 占用 4 个字节。
1.4 BIGINT 整数类型。 BIGINT 范围是-9223372036854775806 到 9223372036854775806。 BIGINT 占用 8 个字节。 示例 1:定义的列数据类型为 BIGINT。
1.5 FLOAT FLOAT 代表一个浮点型数值,占用 4 个字节,它所存储的数值不是一个准 确值。允许的值是-3.402823466E+38 到-1.175494351E-38,0,1.175494351E-38 到 3.402823466E+38。这些是理论限制,基于 IEEE 标准。实际的范围根据硬件 或操作系统的不同可能稍微小些。 GBase 8a 允许在关键字 FLOAT 后面的括号内选择用位指定精度,即 FLOAT(X)。0 到 23 的精度对应 FLOAT 列的 4 字节单精度,24 到 53 的精度 对应DOUBLE列的8字节双精度。当24<=X<=53时,FLOAT(X)与DOUBLE(X)等价。同时 GBase 8a 允许使用非标准语法 FLOAT(M,D)(M 是整数位数和小数 位数的总位数,D 是小数的个数),GBase 8a 保存值时进行四舍五入。 示例 1:定义的列数据类型为 FLOAT。 示例中用到的表及数据: DROP TABLE IF EXISTS products; CREATE TABLE products(productnum FLOAT); INSERT INTO products(productnum) VALUES(-19000.44365), (-19000.48365),(1.44365),(1.443658); gbase> SELECT productnum FROM products; +------------+ | productnum | +------------+ | -19000.4 | | -19000.5 | | 1.44365 | | 1.44366 | +------------+ 4 rows in set 示例 2:定义的列数据类型为 FLOAT(M),总位数小于等于 23 时,小数 部分只保留一位有效数字,系统会自动对数字进行四舍五入。定义的列数据类型为 FLOAT(M),总位数大于 23 时,小数位最大支持 15 位数字。 示例中用到的表及数据: DROP TABLE IF EXISTS products; CREATE TABLE products (a FLOAT(20),b FLOAT(28)); INSERT INTO products (a,b) VALUES(-19000.44365,-19000.44365); gbase> SELECT * FROM products; +----------+--------------+ | a | b | +----------+--------------+ | -19000.4 | -19000.44365 | +----------+--------------+ 1 row in set 示例 3:定义的列数据类型为 FLOAT(7,4),插入的数据为 999.00009 时, 其近似值就是 999.0001,自动四舍五入。 示例中用到的表及数据: DROP TABLE IF EXISTS products; CREATE TABLE products(productnum FLOAT(7,4))INSERT INTO products(productnum) VALUES(999.00009); GBase 8a SQL 参考手册 南大通用数据技术股份有限公司 - 9 - gbase> SELECT productnum FROM products; +------------+ | productnum | +------------+ | 999.0001 | +------------+ 1 row in set 示例 4:定义的列数据类型为 FLOAT(26,5),指定精度为 5,则小数部分保 留 5 位数字。 示例中用到的表及数据: DROP TABLE IF EXISTS products; CREATE TABLE products(productnum FLOAT(26,5)); INSERT INTO products(productnum) VALUES(19000.44365); gbase> SELECT productnum FROM products; +-------------+ | productnum | +-------------+ | 19000.44336 | +-------------+ 1 row in set
1.6 DOUBLE DOUBLE 代表一个浮点型数值,占用 8 个字节,它所存储的数值不是一个 准确值。 允许的值是-1.7976931348623157E+308 到-2.2250738585072014E-308、0 和 2.2250738585072014E-308 到 1.7976931348623157E+308。这些是理论限制,基 于 IEEE 标准。实际的范围根据硬件或操作系统的不同可能稍微小些。 GBase 8a 允许在关键字 DOUBLE 后面的括号内选择用位指定精度,即 DOUBLE (X)。0 到 23 的精度对应 FLOAT 列的 4 字节单精度,24 到 53 的精 度对应 DOUBLE 列的 8 字节双精度。当 24<=X<=53>时,FLOAT(X)与 DOUBLE(X)等价。 同时 GBase 8a 允许使用非标准语法 DOUBLE(M,D)(M 是整数位数和小 数位数的总位数,D 是小数的个数),GBase 8a 保存值时进行四舍五入。 示例 1:定义的列数据类型为 DOUBLE。 示例中用到的表及数据: DROP TABLE IF EXISTS products; CREATE TABLE products(productnum DOUBLE); INSERT INTO products(productnum) VALUES(-19000.44365); gbase> DESC products; +------------+--------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +------------+--------+------+-----+---------+-------+| productnum | double | YES | | NULL | | +------------+--------+------+-----+---------+-------+ 1 row in set gbase> SELECT productnum FROM products; +--------------+ | productnum | +--------------+ | -19000.44365 | +--------------+ 1 row in set
1.7 DECIMAL DECIMAL[(M[, D])]代表一个精确值,它所存储的数值范围是-(1E+M -1)/(1E+D)到(1E+M -1)/(1E+D)。 在 DECIMAL[(M[, D])]数据类型中,M 是总位数,支持的最大长度为 65; D 是小数点后面的位数,支持的最大长度为 30。 在不需要过高的数字精度的场景中,DECIMAL 中的 M 可以定义为 M≤18, 这样可以获得更好的查询性能。 DECIMAL 用来存储那些严格要求数字精度的数据,例如货币数据,在这种 情况下需要指定精度: salary DECIMAL(5,2)
2. 字符类型
2.1 CHAR CHAR(M) CHAR 类型仅仅是为了兼容 SQL 标准,因此,不建议使用者在实际的项目 应用场景使用此数据类型,建议使用 VARCHAR 数据类型。 CHAR 是 CHARACTER 的缩写。m 表示该列中字符串的长度,其范围是 1 到 255 个字符。 当存储 CHAR 值时,它们会被用空格右填充到指定长度。当读取 CHAR 值 时,填充的空格依旧保留。 如果给一个定义为 CHAR 类型的列插入一个超出最大长度的字符串,那么 将报告报错。
2.2 VARCHAR VARCHAR(M) 可变长字符串。M 表示表示该列中串的长度。M 的范围是 1 到 10922 个字 符。 当存储 VARCHAR 类型的数据时,不会用空格填充补足列定义长度,存储 的数据包含空格时,保留空格。 示例 1:VARCHAR 数据类型不会补足列定义的长度,但会保留插入的数 据中的空格。示例中用到的表及数据: DROP TABLE IF EXISTS products; CREATE TABLE products (productName VARCHAR(100)); INSERT INTO products(productName) VALUES('南大通用'); INSERT INTO products(productName) VALUES('南大通用 '); gbase> SELECT productName, LENGTH(productName) AS length, CHAR_LENGTH(productName) AS char_length FROM products; +----------------+--------+-------------+ | productName | length | char_length | +----------------+--------+-------------+ | 南大通用 | 12 | 4 | | 南大通用 | 14 | 6 | +----------------+--------+-------------+ 2 rows in set gbase> SELECT productName FROM products WHERE productName = '南大通用'; +--------------+ | productName | +--------------+ | 南大通用 |+--------------+ 1 row in set 查询结果中保留原始数据中的空格: gbase> SELECT productName FROM products WHERE productName = '南大通用 '; +--------------+ | productName | +--------------+ | 南大通用 | +--------------+ 1 row in set
2.3TEXT TEXT 类型仅仅是为了兼容其它数据库的类型,推荐使用 VARCHAR 类型。 TEXT 类型最大支持 10922 字符的存储长度,定义 TEXT 列时,不能为它指 定 DEFAULT 值。
3.二进制数据类型
BLOB 保存二进制数据,最大长度为 32767 字节。 使用 BLOB 数据类型,有如下约束: BLOB 列支持 32KB 的存储容量。 创建表时,BLOB 列不可以有 DEFAULT 值。 查询语句中,BLOB 列不支持过滤条件。 查询语句中,BLOB 列不支持 OLAP 函数。
4. 日期和时间类型
当使用日期和时间类型时,用户应当提供正确的格式:如,YYYY-MM-DD、 YYYY-MM-DD HH:MI:SS。
4.1 DATE 日期类型。支持的范围是“0001-01-01”到“9999-12-31”。 GBase 8a 以“YYYY-MM-DD”格式显示 DATE 值。 示例 1:插入一个标准的 DATE 值。 gbase> DROP TABLE IF EXISTS products; Query OK, 0 rows affected gbase> CREATE TABLE products (productDate DATE); Query OK, 0 rows affected gbase> INSERT INTO products(productDate) VALUES('2010-09-01'); Query OK, 1 row affected gbase> SELECT productDate FROM products; +-------------+ | productDate | +-------------+ | 2010-09-01 | +-------------+ 1 row in set 示例 2:插入一个 NULL 值。 gbase> DROP TABLE IF EXISTS products; Query OK, 0 rows affected gbase> CREATE TABLE products (productDate DATE); Query OK, 0 rows affected gbase> INSERT INTO products(productDate) VALUES(NULL); Query OK, 1 row affected gbase> SELECT productDate FROM products; +-------------+ | productDate | +-------------+ | NULL | +-------------+ 1 rows in set 示例 3:插入一个非法的 DATE 值,系统报告错误信息。 GBase 8a SQL 参考手册 南大通用数据技术股份有限公司 - 21 - gbase> DROP TABLE IF EXISTS products; Query OK, 0 rows affected gbase> CREATE TABLE products (productDate DATE); Query OK, 0 rows affected gbase> INSERT INTO products(productDate) VALUES('2010-09-31'); ERROR 1292 (22007): Incorrect date value: '2010-09-31' for column 'productDate' at row 1
4.2 TIME GBase 8a 以“HH:MI:SS”格式(或“HHH:MI:SS”格式)检索和显示 TIME 值,该值为字符串。 TIME 值的范围可以从“-838:59:59”到“838:59:59”。TIME 类型不仅可以 用于表示一天的时间(这一定不会超过 24 小时),而且可以用来表示所经过的 时间或两个事件之间的时间间隔(这可能比 24 小时大许多或是一个负值)。 对于以字符串指定的包含时间定界符的 TIME 值,不必要为小于 10 的时、 分或秒指定两位数值。“8:3:2”与“08:03:02”是一致的。 示例 1:插入一个合法的 TIME 值。 gbase> DROP TABLE IF EXISTS products; Query OK, 0 rows affectedgbase> CREATE TABLE products (productDate TIME); Query OK, 0 rows affected gbase> INSERT INTO products(productDate) VALUES('12:09:44'); Query OK, 1 row affected gbase> SELECT productDate FROM products; +-------------+ | productDate | +-------------+ | 12:09:44 | +-------------+ 1 row in set 示例 2:插入一个在“-838:59:59”到“838:59:59”之间,且超过 24 小时之 间的 TIME 值。 gbase> DROP TABLE IF EXISTS products; Query OK, 0 rows affected gbase> CREATE TABLE products (productDate TIME); Query OK, 0 rows affectedgbase> INSERT INTO products(productDate) VALUES('92:09:44'); Query OK, 1 row affected gbase> SELECT productDate FROM products; +-------------+ | productDate | +-------------+ | 92:09:44 | +-------------+ 1 row in set
4.3 DATETIME GBase 8a 以“YYYY-MM-DD HH:MI:SS.ffffff”格式显示 DATETIME 值。 其中 ffffff 表示微秒格式。 日期和时间的组合类型。支持的范围是“0001-01-01 00:00:00.000000”到 “9999-12-31 23:59:59.999999”。 示例 1:插入一个合法的 DATETIME 值。 gbase> DROP TABLE IF EXISTS products; Query OK, 0 rows affected gbase> CREATE TABLE products (productDate DATETIME); Query OK, 0 rows affectedgbase> INSERT INTO products(productDate) VALUES('2010-09-01 12:09:44'); Query OK, 1 row affected gbase> SELECT productDate FROM products; +---------------------+ | productDate | +---------------------+ | 2010-09-01 12:09:44 | +---------------------+ 1 row in set 示例 2:插入系统当前的 DATATIME 值。 gbase> DROP TABLE IF EXISTS products; Query OK, 0 rows affected gbase> CREATE TABLE products (productDate DATETIME); Query OK, 0 rows affected gbase> INSERT INTO products(productDate) VALUES(Now()); Query OK, 1 row affectedgbase> SELECT productDate FROM products; +---------------------+ | productDate | +---------------------+ | 2013-12-13 17:44:23 | +---------------------+ 1 row in set 示例 3:插入一个 NULL 值。 gbase> DROP TABLE IF EXISTS products; Query OK, 0 rows affected gbase> CREATE TABLE products (productDate DATETIME); Query OK, 0 rows affected gbase> INSERT INTO products(productDate) VALUES(NULL); Query OK, 1 row affected gbase> SELECT productDate FROM products; +-------------+ GBase 8a SQL 参考手册 - 26 - 南大通用数据技术股份有限公司 | productDate | +-------------+ | NULL | +-------------+ 1 row in set 示例 4:插入一个带有微秒的 DATETIME 数值。 gbase> INSERT INTO products(productDate) VALUES('2013-09-15 12:09:44.123456'); Query OK, 1 row affected gbase> SELECT productDate FROM products; +----------------------------+ | productDate | +----------------------------+ | 2013-09-15 12:09:44.123456 | +----------------------------+ 1 row in set 示例 5:插入一个非法的 DATETIME 值,系统将报告错误信息。 gbase> DROP TABLE IF EXISTS products; Query OK, 0 rows affectedgbase> CREATE TABLE products (productDate DATETIME); Query OK, 0 rows affected gbase> INSERT INTO products(productDate) VALUES('2010-09-31 12:09:44'); ERROR 1292 (22007): Incorrect datetime value: '2010-09-31 12:09:44' for column 'productDate' at row 1
4.4 TIMESTAMP TIMESTAMP 类型仅仅是为了兼容 SQL 标准,因此,不建议使用者在实际 的项目应用场景使用此数据类型,推荐使用 DATETIME 数据类型。 TIMESTAMP 的格式为“YYYY-MM-DD HH:MI:SS”,支持的范围是 “1970-01-01 08:00:01”到“2038-01-01 00:59:59”。 使用 DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP 属性时,TIMESTAMP 列支持 INSERT、UPDATE 以 及 MERGE 时,TIMESTAMP 列的值自动更新,但是 DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP 在一张表中只 能使用一次,也就是含有多个 TIMESTAMP 列时,只能给第一次出现 TIMESTAMP 的列使用 DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP 属性。 创建一张表时,如果只定义一个 TIMESTAMP 列,DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP 可以省略,系 统会自动添加上。 示例:gbase> CREATE TABLE t (a int,b timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, c timestamp DEFAULT '2013-01-01 00:00:01'); Query OK, 0 rows affected gbase> SHOW CREATE TABLE t; +-------+--------------------------------------------------------------- -+ | Table | Create Table | +-------+--------------------------------------------------------------- -+ | t | CREATE TABLE "t" ( "a" int(11) DEFAULT NULL, "b" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, "c" timestamp NOT NULL DEFAULT '2013-01-01 00:00:01' ) ENGINE=EXPRESS DEFAULT CHARSET=utf8 TABLESPACE='sys_tablespace' | +-------+--------------------------------------------------------------- -+ 1 row in set TIMESTAMP 使用限制: 以下限制说明,是针对 TIMESTAMP 数据列自动更新时的场景: 1. 在一张表中,只能自动更新表中第一个出现的 TIMESTAMP 列,并且 必须使用 DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP 来定义。 2. 在一张表中,使用 DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP 来指定 TIMESTAMP 列自动更新时,只能使 用一次,且用于第一个 TIMESTAMP 列。
感谢观看