字符数据类型

字符数据类型存储字符串值。

内置字符类型

表 1. 内置字符数据类型的属性
  大小(以字节计) 缺省值 保留 整理 长度
CHAR(n) 1 至 32,767 1 个字节 代码集 固定
NCHAR(n) 1 至 32,767 1 个字节 本地化 固定
VARCHAR(m, r) 1 到 255 对于 r 为 0 0 至 255 个字节 代码集 可变
NVARCHAR(m, r) 1 到 255 对于 r 为 0 0 至 255 个字节 本地化 可变
LVARCHAR(m) 1 至 32,739 2048 个字节 代码集 可变

数据库服务器还可以使用 LVARCHAR 表示不透明数据类型的外部格式。在数据库服务器的 I/O 操作中,除文件大小限制、操作系统或硬件资源的限制之外,LVARCHAR 数据值的大小没有上限。

字符类型声明中的逻辑字符语义

GBase 8s 支持配置参数 SQL_LOGICAL_CHAR,其设置可指示 SQL 解析器将 CREATE TABLE 或 ALTER TABLE 语句数据类型声明中字符列的最大大小解释为逻辑字符,而不是以字节为单位。

创建数据库之后,数据库服务器的当前 SQL_LOGICAL_CHAR 设置会记录在系统目录的 systables 表中。设置为 OFF 或 1 时,该功能对随后在数据库中创建或变更的表没有影响。

然而,在 SQL_LOGICAL_CHAR 设置为 ON 或为 2、3 或 4 之间的数字的数据库中,针对以下字符类型,SQL 解析器会将显式和隐式大小声明解释为 SPL 变量声明和数据库表中的列声明中的逻辑字符:

此功能对之前表中列出的字符类型的最大存储大小限制没有影响。然而,对于使用多字节语言环境的数据库,可在将字符串插入到字符列或指定给字符变量时,降低数据截断的风险。

例如,如果数据库的 SQL_LOGICAL_CHAR 设置是 4,那么 VARCHAR(10, 5) 规范会解释为要求最大 40 个字节的存储,保留这些字节中的 5 个,在标准 SQL 表示法中创建 VARCHAR(40, 5) 数据类型,而不是声明中指定的规范。

由于多字节字符的最小大小是 1 个字节,因此 VARCHAR 和 NVARCHAR 数据类型的保留大小参数不受 SQL_LOGICAL_CHAR 设置影响。在此示例中,5 多字节字符的最小大小是 5 个字节,大小保持不变。

请参阅《GBase 8s 管理员参考》中对 SQL_LOGICAL_CHAR 配置参数的描述,以获取有关 SQL_LOGICAL_CHAR 设置对 DB_LOCALE 指定多字节语言环境的数据库的影响的更多信息。有关多字节语言环境和逻辑字符的更多信息,请参阅《GBase 8s GLS 用户指南》。

IDSSECURITYLABEL

GBase 8s 还支持将 IDSSECURITYLABEL 数据类型用于实现基于标号的访问控制 (LBAC) 的系统。此内置数据类型可正式归类为字符类型,因为其定义为 VARCHAR(128) 的 DISTINCT 数据类型,但只有拥有 DBSECADM 角色的用户可在 DDL 操作中声明此数据类型。它支持 LBAC 安全性功能,而不是作为通用字符类型发挥功能。

数据类型提升

对于 GBase 8s 的一些字符串操纵操作,上面列出的五个内置字符数据类型支持数据类型提升,以降低由于返回的字符串太大而无法存储在 NVARCHAR 或 VARCHAR 列或程序变量中,从而导致字符串操作失败的风险。请参阅 GBase 8s SQL 指南:语法 中的“从 CONCAT 和 String 操纵函数返回的类型”主题,以获取在 GBase 8s 字符类型之间进行数据类型提升的详细信息。

本地语言支持

有时,NCHAR 和 NVARCHAR 类型称为本地语言支持数据类型,因为其支持本地化的整理。由于 VARCHAR 或 NVARCHAR 类型的列没有缺省大小,因此您必须在声明中指定大小(不大于 255)。对于定义索引的 VARCHAR 或 NVARCHAR 列,最大大小是 254 个字节。

NLSCASE lNSENSITIVE 数据库

在使用 NLSCASE INSENSITIVE 关键字选项创建的数据库中,对 NCHAR 或 NVARCHAR 类型数据字符串的操作不区分相同字母的大小写变体。行使用装入字符时所用字母大小写存储在 NCHAR 或 NVARCHAR 列中,但由相同字母以相同顺序组成的数据字符串将求值为重复,即使某些字母的大小写不同。例如,三个 NCHAR 字符串 "ABC""AbC""abC" 将视为重复。其他内置字符类型(包括 CHAR、LVARCHAR 和 VARCHAR)遵循缺省的区分大小写规则,以便 CHAR 列中的三个相同字符串求值为不同值。

使用 NLSCASE INSENSITIVE 属性的数据库还忽略基本类型为 NCHAR 或 NVARCHAR 的 DISTINCT 数据类型的字母大小写,以及已命名或未命名 ROW 类型中的 NCHAR 或 NVARCHAR 字段、COLLECTION 数据类型的 NCHAR 或 NVARCHAR 元素,包括 LIST、SET 或 MULTISET。

在不区分 NCHAR 或 NVARCHAR 值的字母大小写的数据库中,字符串操纵操作可能会生成意外的结果(如果它们将 CHAR、LVARCHAR 或 VARCHAR 操作数或参数隐式强制转型为 NCHAR 或 NVARCHAR 数据类型)。在一些上下文中,操作可能返回重复字符串,尽管数据库服务器不会将这些字母大小写变体视为原始数据类型的重复值。