3. KingbaseES SQL 基本元素

本章包含KingbaseES SQL基本元素的信息。这些元素是 SQL 语句的最简单构建基础。因此,在使用本书中描述的 SQL 语句之前,应该熟悉本章中介绍的概念。

本章包含以下内容:

3.1. 数据类型

KingbaseES数据库操作的每个值都有其数据类型。数据类型具有特定的属性,因此对不同数据类型的值KingbaseES处理是不同的。例如,可以添加NUMBER 数据类型的值,就不能添加RAW数据类型的值。

创建表时,必须为其每个列指定数据类型。创建过程或存储函数时,必须为其每个参数指定数据类型。数据类型定义每列的值域或每个参数的值域。例如,DATE列不能接受值 2 月 29 日(闰年除外)或值 2 或“SHOE”。插入列中的每个值都认定为该数据类型。例如,如果插入'01-JAN-98'值到DATE 列中,则 KingbaseES会在验证字符串转换为有效日期后将其视为DATE值。

KingbaseES数据库提供了许多内置数据类型,和用户自定义类型。下面会逐一介绍各数据类型。本节分为以下几部分内容:

3.1.1. KingbaseES内置数据类型

3.1.1.1. 字符数据类型

字符数据类型存储字符(字母数字)数据,包括单词和自由格式文本,以数据库字符集或国际字符集形式存储。比其他数据类型的限制少,具有较少的属性。例如,字符列可以存储所有字母数字值,但数值列只能存储数值。

字符数据存储在字符串中,其字节值与建库时指定的字符集对应,如 7 位 ASCII 或 EBCDIC。KingbaseES数据库支持单字节和多字节字符集。

表 3.1.27 字符类型

名字

描述

character varying[(n [char | byte])])

varchar(n [char | byte])

varchar2(n [char | byte])

nvarchar2(n [char | byte])

nvarchar(n [char | byte])

有限制的变长

n取值最小为 1 字节或 1 字符

最大10485760字节或字符

n缺省值为1。

char 或 byte 的默认值由

NLS_LENGTH_SEMANTICS 确定。

(n可以取'*',表示不限制长度)

character(n [char | byte])

char(n [char | byte])

char(n [char | byte])

指定长度的定长字符,最大长度是

最大长度是10485760个字节或者字符

n缺省值为1

char 或 byte 的默认值由

NLS_LENGTH_SEMANTICS 确定。

text

无限变长,存储任何长度的字符串

存储最大值为1G。

3.1.1.1.1. character[(n [char | byte])]数据类型

语法:character[(n [char | byte])]

别名:char[(n [char | byte])]

定长字符串,n 限定字符串长度,如果显式指定 char,则表示n个字符长度;如果显式指定byte,则表示n个字节长度;

如果没有显式指定,则以系统参nls_length_semantics为准,若系统参数 nls_length_semantics 为 char,则以字符为单位,否则以字节为单位。

值域:定长,不足定义长度时在最右边以空格补齐。n 的最大值为 10485760,最小值为1,默认值为1。如果字符串的长度超出 n,则按照 SQL 标准截断 (兼容PostgreSQL模式下,超出部分都是空格) 或报错。

用例:

  1. nls_length_semantics为 缺省是 char 的情况

    set nls_length_semantics为='char';
    create table test_default_char (col char(4));
    insert into test_default_char values ('1234');
    insert into test_default_char values ('12345');
    ERROR:  value too long for type character(4)
    insert into test_default_char values ('一二');
    insert into test_default_char values ('一二三');
    select col, length(col) from test_default_char;
       COL   | LENGTH
    ---------+--------
     1234    |      4
     一二    |      2
     一二三  |      3
    
    1. nls_length_semantics 缺省是 byte 的情况

      set nls_length_semantics为='byte';
      create table test_default_byte (col char(4));
      insert into test_default_byte values ('1234');
      insert into test_default_byte values ('12345');
      ERROR:  用于类型字符(4 byte)的值过长
      insert into test_default_byte values ('一');
      insert into test_default_byte values ('一二三');
      ERROR:  用于类型字符(4 byte)的值过长
      select col, length(col) from test_default_byte;
       COL  | LENGTH
      ------+--------
       1234 |      4
       一   |      1
      

      显式指定是 byte 的情况

      create table test_byte (col char(4 byte));
      insert into test_byte values ('1234');
      insert into test_byte values ('12345');
      ERROR:  用于类型字符(4 byte)的值过长
      insert into test_byte values ('一');
      insert into test_byte values ('一二三');
      ERROR:  用于类型字符(4 byte)的值过长
      select col, length(col) from test_byte;
       COL  | LENGTH
      ------+--------
       1234 |      4
       一   |      1
      
    2. 显式指定是 char 的情况

      create table test_char (col char(4 char));
      insert into test_char values ('1234');
      insert into test_char values ('12345');
      ERROR:  用于类型字符(4)的值过长
      insert into test_char values ('一二三四');
      insert into test_char values ('一二三四五');
      ERROR:  用于类型字符(4)的值过长
      select col, length(col) from test_char;
         COL    | LENGTH
      ----------+--------
       1234     |      4
       一二三四 |      4
        使用此数据类型创建列存储表的情况
      当nls_length_semantics为 缺省是 char 时:
      set nls_length_semantics='char';
      create table test_default_char (col char(4));
      文件“c:\file.txt”中内容如下:
          1234
          12345
      执行语句:copy test_default_char from 'c:\file.txt';
      ERROR:  value too long for type char varying(4)
      CONTEXT:  COPY test_default_char, line 2, column col: "12345"
      

3.1.1.1.2. character varying[(n [char | byte])] 数据类型

语法:character varying[(n [char | byte])]

别名:varchar[(n [char | byte])]

varchar2[(n [char | byte])]

nvarchar2[(n [char | byte])]

nvarchar[(n [char |byte])]

变长字符串,如果显式指定了 char,则表示n个字符长度;如果显式指定byte,则表示n个字节长度; 如果没有显式指定,则以系统参数 nls_length_semantics为准,若系统参数 nls_length_semantics 为 char,则以字符为单位,否则以字节为单位。

值域:变长,有长度限制。字符串长度小于 n 时不在字符串右边用空格补齐。n 的最大值为 10485760。如果n缺省,则character varying 表示接受任何长度的串。

用例:

  1. nls_length_semantics 缺省是 char 的情况

    set nls_length_semantics='char';
    create table test_default_varchar (col varchar(4));
    insert into test_default_varchar values ('1234');
    insert into test_default_varchar values ('12345');
    ERROR:  类型VARCHAR(4)的值过长
    insert into test_default_varchar values ('一二');
    insert into test_default_varchar values ('一二三');
    select col, length(col) from test_default_varchar;
      COL   | LENGTH
    --------+--------
     1234   |      4
     一二   |      2
     一二三 |      3
    
  2. nls_length_semantics 缺省是 byte 的情况

    set nls_length_semantics='byte';
    create table test_default_varbyte (col varchar(4));
    insert into test_default_varbyte values ('1234');
    insert into test_default_varbyte values ('12345');
    ERROR:  类型VARCHAR(4 byte)的值过长
    insert into test_default_varbyte values ('一');
    insert into test_default_varbyte values ('一二三');
    ERROR:  类型VARCHAR(4 byte)的值过长
    select col, length(col) from test_default_varbyte;
     COL  | LENGTH
    ------+--------
    1234   |      4
    一     |      2
    
  3. 显式指定是 byte 的情况

    create table test_varbyte (col varchar(4 byte));
    insert into test_varbyte values ('1234');
    insert into test_varbyte values ('12345');
    ERROR:  类型VARCHAR(4 byte)的值过长
    insert into test_varbyte values ('一');
    insert into test_varbyte values ('一二三');
    ERROR:  类型VARCHAR(4 byte)的值过长
    select col, length(col) from test_varbyte;
     COL  | LENGTH
    ------+--------
     1234 |      4
     一   |      2
    
  4. 显式指定是 char 的情况

    create table test_varchar (col varchar(4 char));
    insert into test_varchar values ('1234');
    insert into test_varchar values ('12345');
    ERROR:  类型VARCHAR(4)的值过长
    insert into test_varchar values ('一二三四');
    insert into test_varchar values ('一二三四五');
    ERROR:  类型VARCHAR(4)的值过长
    select col, length(col) from test_varchar;
       COL    | LENGTH
    ----------+--------
     1234     |      4
     一二三四 |      4
      使用此数据类型创建列存储表的情况
    nls_length_semantics 缺省是 char 的情况
    set nls_length_semantics='char';
    create table test_default_varchar (col varchar(4));
    文件“c:\file.txt”中内容如下:
        1234
        12345
    执行语句:copy test_default_varchar from 'c:\file.txt';
    ERROR:  value too long for type character varying(4)
    CONTEXT:  COPY test_default_varchar, line 2, column col: "12345"
    
  5. 使用字符类型

CREATE TABLE test1 (a character(4));
INSERT INTO test1 VALUES ('ok');
SELECT a, char_length(a) FROM test1;

  a   | char_length
------+-------------
 ok   |           2


CREATE TABLE test2 (b varchar(5));
INSERT INTO test2 VALUES ('ok');
INSERT INTO test2 VALUES ('good      ');
ERROR:  value too large for column "public"."test2"."b" (actual:10, maximum:5)
INSERT INTO test2 VALUES ('too long');
ERROR:  value too large for column "public"."test2"."b" (actual:8, maximum:5)
INSERT INTO test2 VALUES ('too long'::varchar(5));
SELECT b, char_length(b) FROM test2;

   b   | char_length
-------+-------------
 ok    |           2
 too l |           5

在KingbaseES里另外还有两种定长字符类型,在 表 3.1.28 里显示。name类型只用于在内部系统目录中存储标识符并且不是给一般用户使用的。该类型长度当前定为 64 字节(63 可用字符加结束符)但在C源代码应该使用常量 NAMEDATALEN引用。这个长度是在编译的时候设置的(因而可以为特殊用途调整),缺省的最大长度在以后的版本可能会改变。类型"char"(注意引号)和 char(1)是不一样的,它只用了一个字节的存储空间。它在系统内部用于系统目录当做简化的枚举类型用。

表 3.1.28 特殊字符类型

名字

存储尺寸

描述

"char"

1字节

单字节内部类型

name

64字节

用于对象名的内部类型

3.1.1.1.3. TEXT 数据类型

语法:TEXT

变长字符串类型。其字符串的长度最大为 1G。使用该类型存储长的文本串。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐