关键字:
KingbaseES、字符数据类型、字符类型、日期/时间类型、人大金仓、KingbaseES
在KingbaseES数据库中,我们操作的每一个值都具有它的数据类型,因此当我们需要声明一个PL/SQL变量(或常量)时,应该指明它的数据类型。PL/SQL中一共提供了两类不同的数据类型,包括标量数据类型和复合数据类型。标量数据类型是一种最基础的数据类型,与复合数据类型可以存储一组值或多个字段不同,它只能存储一个数据。本文将对PL/SQL标量数据类型中的SQL类型进行详细介绍。
什么是SQL数据类型
PL/SQL是SQL在KingbaseES数据库上的过程扩展语言,它继承了SQL语言的数据类型并在此基础上进行了扩展,为管理和操作数据提供了更大的灵活性。SQL数据类型主要包含一些KingbaseES的内置类型,如:字符数据类型、数值类型、日期/时间类型等。在实际编程中,我们根据所需存储数据的性质和用途为其选择最合适的存储类型。
字符数据类型
字符数据类型用于存储字符数据,PL/SQL支持存储固定长度和可变长度的字符数据。下表对KingbaseES SQL中的字符数据类型进行了总结。
功能描述 | 存储尺寸 | 类型名字 |
存储字符串类型数据 | 固定长度 | CHARACTER(CHAR) | NCHAR |
可变长度 | VARCHAR | VARCHAR2 NVARCHAR | NVARCHAR2 | |
存储文本类型数据 | 无限变长 | TEXT |
下面列出了一些常用字符数据类型的声明格式:
1)CHAR类型的声明格式:variable_name CHAR[(n [char | byte])];
其中,n用于限定字符串的长度(默认值为1字符)。由于该类型限定了字符串的长度,因此当变量、常量或参数等不足定义长度时,会自动在最右边用空格补齐。
2)VARCHAR2类型的声明格式:variable_name varchar2[(n [char | byte])];
其中,n用于限定字符串的最大长度,当n缺省时,则代表字符串可以为任何长度。与CHAR类型不同,该类型不需要在字符串右边用空格补齐。其在PL/SQL中还有一个预定义子类型SRING,用法与VARCHAR2基本一致。
3)TEXT类型的声明格式:variable_name TEXT;
使用TEXT类型声明的字符串,其最大长度可以为1G,因此可用于存储较长的文本串。
接下来,让我们通过一个例子来了解这些类型的具体用法:
\set SQLTERM / DECLARE i CHAR(10) := '1'; --定义一个长度为10的定长字符串 j VARCHAR2(10) := 'kingbase'; --定义一个最大长度为10的变长字符串 k TEXT := 'kingbase_kingbase_kingbase_kingbase_kingbase'; BEGIN RAISE NOTICE 'char(10) : %;', i; RAISE NOTICE 'varchar2(10): %;', j; RAISE NOTICE 'text : %;', k; END; / |
打印结果如下:
可以看到,当变量i的长度小于10时,不足部分会自动在最右边用空格补齐
数值类型
在KingbaseES SQL中,数值类型可用于存储整数、小数、浮点数和NAN。下表列出了KingbaseES SQL中的数值类型
描述 | 类型名字 | 存储尺寸 | 存储范围 |
整数类型 | TINYINT | 1字节 | [-128 , 127] |
SMALLINT | 2字节 | [-32768 , 32767] | |
INT(integer) | 4字节 | [-2147483648 , 2147483647] | |
BIGINT | 8 字节 | [-9223372036854775808 , 9223372036854775807] | |
精确数值数据类型 | NUMBER | NUMERIC | DECIMAL | 可变 | 存储绝对值在 [10-130 , 10126]间 的正、负定点数(包括0) |
浮点类型 | REAL | 4字节 | 范围在-1E+37 到 +1E+37 之间。REAL的精度至少是 6 位小数,DOUBLE PRECISION的精度至少是 15 位小数 |
DOUBLE | 8字节 | ||
FLOAT(p) | 8字节 | 当 p 取1-24 时,与 REAL相同。 当 p 取25-53 时,与 DOUBLE PRECISION 相同。 | |
BINARY_FLOAT | 4字节 | 存储单精度的 32 位浮点数 | |
BINARY_DOUBLE | 8字节 | 存储单精度的 64 位浮点数 |
在这些数值类型中,NUMBER的使用最为广泛,它支持存储各种多种数值类型的数据(包括整数、定点小数和浮点数)。以下为NUMBER类型的声明格式:
variable_name NUMBER (precision, scale) |
其中,precision 表示精度,即整个数中有效位的总数,也就是小数点两边的位数,取值范围为 1~1000。scale 表示标度,是小数部分的数字位数,取值范围为 0~1000。例如NUMBER(8,2)表示声明的数据共有8个有效位,其中小数占两个有效位,该范围内的最大值为999999.99。
除了上述的数值类型,PL/SQL还提供了PLS_INTEGER类型和BINARY_INTEGER类型,这两个类型是相同的,它们存储范围与INTEGER类型一致。
此外,KingbaseES PL/SQL还提供了一些预定义子类型,常用的主要有以下几种:
• SQL 数据类型 BINARY_FLOAT 的子类型:SIMPLE_FLOAT;
• SQL 数据类型 BINARY_DOUBLE 的子类型:SIMPLE_DOUBLE;
• PLS_INTEGER 数据类型的预定义子类型:SIMPLE_INTEGER 。
这些子类型的存储范围都与基本类型相同,但具有NOT NULL约束。因此,如果您知道变量永远不会有NULL值,可以将其声明为这些基本类型的子类型。
下面这个例子,演示了PL/SQL中几种常用数值类型的基本用法:
\set SQLTERM / DECLARE v_num NUMBER(8,2) := 12345.6; --定义含8个有效位且小数占两位的number变量 v_int INT := 5.3; --定义interger变量,并赋值为小数 v_float FLOAT(8) := 50; --定义float变量,精度为8 v_double DOUBLE := 100; --定义double变量 BEGIN RAISE NOTICE 'v_num(number) = %;', v_num; RAISE NOTICE 'v_int(int) = %;', v_int; RAISE NOTICE 'v_float(float) = %;', v_float; RAISE NOTICE 'v_double(double) = %;', v_double; END; / |
打印结果如下:
如结果所示,当NUMBER类型变量v_num不足小数位时,将自动用0在小数点右侧补齐。INT类型变量v_int将小数根据四舍五入的方式自动转换为整数。
日期/时间类型
PL/SQL在处理数据时,难免会需要日期和时间信息。为此,KingbaseES提供了多种日期和时间类型,用于存储、操作和分析时间相关的数据。下表对KingbaseES SQL中的日期/时间类型进行了总结。
描述 | 类型名字 | 有/无时区 | 精确度 |
DATE存储日期和时间 | DATE | 无时区 | 1分 |
TIMESTAMP存储日期和时间 (精确到小数的秒) | timestamp[(p)] [without time zone] | 无时区 | 1微秒 |
timestamp[(p)] with time zone | 有时区 | ||
timestamp[(p)] with local time zone | 有时区 | ||
TIME存储一天的时间(精确到小数的秒) | time [(p)] [without time zone] | 无时区 | 1微秒 |
time [(p)] with time zone | 有时区 | ||
INTERVAL存储时间 间隔 | interval | 无时区 | 1微秒 |
yminterval | 无时区 | 1月 | |
dsinterval | 无时区 | 1纳秒 |
其中,日期包括年月日,时间包括时分秒。在TIMESTAMP和TIME类型中,p 是一个可选项,表示秒精度(即秒字段中小数点后面的位数),取值范围为 0~6,如果缺省p,则表明在精度上没有明确的边界。在下面这个例子中,演示了使用INTERVAL结合TIMESTAMP来记录一段时间的间隔:
\set SQLTERM / DECLARE a DATE; b TIMESTAMP(6); c TIMESTAMP(6); d INTERVAL; s NUMBER; BEGIN a = SYSDATE; b = clock_timestamp(); FOR i IN 1..5000000 LOOP s = 1*1; END LOOP; c = clock_timestamp(); d = c-b; RAISE NOTICE 'a: %', a; RAISE NOTICE 'b: %', b; RAISE NOTICE 'c: %', c; RAISE NOTICE 'd: %', d; end; / |
打印结果如下:
SQL中的其他内置数据类型
除了字符数据类型、数值类型、日期类型之外,KingbaseES SQL中还包含许多其它的数据类型,包括:布尔类型、大对象类型、几何类型、ROWID类型、位串类型、XML类型、JSON类型等。这些丰富的数据类型为数据的存储提供了多样化的选择,以满足不同类型数据的存储需求,例如:大对象数据类型可以存储大型非结构化数据,几何类型可以表示二维的空间物体等。下面将对一些常用的数据类型进行介绍。
1、大对象类型
大对象类型用于存储文本、图像、视频等大型非结构化数据,主要包括以下几类:
数据类型 | 存储对象 |
BLOB | 存储二进制大对象,长度最大为 1G |
CLOB | 存储字符大对象(任何字符集数据),长度最大为 1G |
NCLOB | 存储字符大对象(国家字符集数据),长度最大为 1G |
BFILE | 存储文件的定位符,指向位于外部的二进制文件,长度最大为 1G |
BYTEA | 存储变长二进制串,长度最大为 1G |
RAW | LONGROW | 存储字符大对象,长度最大为 1G |
下面的示例中,演示了两种常用的大对象类型的声明格式:
a BLOB; b CLOB; |
2、XML类型
XML 数据类型用于存储XML数据,使用函数XMLPARSE,可以从字符串中生成一个XML类型的数据:
XMLPARSE ( { DOCUMENT | CONTENT } value) |
下面这个例子中展示了XMLPARSE的简单用法:
\set SQLTERM / DECLARE a XML; BEGIN a := XMLPARSE (DOCUMENT '<?xml version="1.0"?><student><name> ZangSan </name></student>'); RAISE NOTICE '%', a; END; / |
打印结果如下:
3、位串类型
位串指的是由1和0组成的串,主要包括BIT类型和BIT VARING类型。这两个类型都有一个可选项n,用于限制长度,其基本用法如下:
\set SQLTERM / DECLARE a BIT VARYING(7); --指定位串的长度只能为7,过长或过段都会报错 b BIT(7); --限制位串的最大长度为7,长度超过7会报错 BEGIN a := 101101; b := 10001100; END; / |
打印结果如下:




