数据定义语句

GBase 8s 支持配置参数 SQL_LOGICAL_CHAR,通过其设置,当您在支持多字节代码集的语言环境中声明字符数据类型时,可以简化某些 SQL 数据定义语言 (DDL) 语句的使用。

如果 GBase 8s 实例将 SQL_LOGICAL_CHAR 设置为在字符数据类型的声明中启用逻辑字符语义,那么存储语言环境代码集单个字符所需的最大字节数会影响以下 SQL 数据定义语句:

SQL_LOGICAL_CHAR 设置还可以在 SPL 的 DEFINE 语句声明字符变量时对其产生影响。

SQL_LOGICAL_CHAR 功能可以为在单字节语言环境(例如缺省语言环境)但稍后在多字节语言环境中部署的数据管理应用程序解决潜在的问题。缺省情况下,以字节为单位解释字符数据类型声明中的数字大小规范。例如,可以存储最多 10 个字节字符串的字符列仅可以存储每个需要四字节存储空间的两个逻辑字符。为单字节语言环境设计的表模式可能会使多字节字符串操作中发生数据截断。

但是,SQL_LOGICAL_CHAR 配置参数的设置可以更改 SQL 解析器的行为,这样便会以逻辑字符为单位而非作为字节解释字符数据类型声明中的大小规范。如此参数的设置所指定,最大的声明大小将与数字因子相乘。

下表显示了有效的设置以及它们的作用:
作用
OFF 或 1 不会扩展声明的大小
2 使用 2 作为声明大小的扩展因子。
3 使用 3 作为声明大小的扩展因子。
4 使用 4 作为声明大小的扩展因子。
ON 使用 M 作为扩展因子,其中 M 是任意逻辑字符在当前数据库的代码集中所需的最大存储空间长度。根据与 DB_LOCALE 设置关联的代码集,M 是范围为从 1(在单字节语言环境中)到 4 的正整数。
当 SQL_LOGICAL_CHAR 配置参数设置为大于 1 的值时,它会指示 SQL 解析器在 SPL 变量的声明中以及在定义以下数据类型列的 CREATE TABLE 和 ALTER TABLE 语句中,将显式和隐式大小声明解释为逻辑字符而非字节:

但是,SQL_LOGICAL_CHAR 设置对 TEXT 或 CLOB 对象,或者对存储字符串的用户定义数据类型 (UDT) 不会起作用。

启用数据库语言环境的逻辑字符语义可以保证有足够的存储空间可供数据类型用来存储指定数目的逻辑字符。数据库表中的字符列或 SPL 字符变量所生成的大小(以字节为单位)是数据类型声明大小乘以 SQL_LOGICAL_CHAR 值(若此大小为 234),或乘以数据库语言环境代码集中最大逻辑字符所需的最大存储字节数(若 SQL_LOGICAL_CHAR 设置为“ON” 或 “on”)的乘积。

例如,如果整数扩展因子是 4,那么尽管具有 CHAR(10) 声明,CHAR(10) 数据类型规范也会要求 40 个存储字节,同时以标准 SQL 表示法创建 CHAR(40) 数据类型。

若为 NVARCHAR 和 VARCHAR 数据类型,则此功能不会影响指定最小存储量的已声明保留大小。例如,整数设置同样是 4,那么尽管具有 VARCHAR(10,5) 声明,VARCHAR(10,5) 数据类型规范(以 4 为扩展因子)也会要求最多 40 个存储字节并保留其中 5 个,同时以标准 SQL 表示法创建 VARCHAR(40, 5) 数据类型。(由于多字节字符的最小大小为 1 个字节,因此 SQL_LOGICAL_CHAR 设置不会影响 VARCHAR 和 NVARCHAR 的保留大小参数。在此示例中,5 个多字节字符的最小大小是 5 个字节,因此声明的大小仍保持不变。)

当大于 1 的有效 SQL_LOGICAL_CHAR 设置起作用时,不具有大小规范的 VARCHAR 或 NVARCHAR 声明解释为 1 个逻辑字符,且生成的数据类型会与 SQL_LOGICAL_CHAR 设置占用相同数目的存储字节。

若为未指定大小的 LVARCHAR 列声明,缺省的大小解释为 2048 个逻辑字符。但是,当 LVARCHAR 用于不透明数据类型的 I/O 操作时,最大大小的限制取决于操作系统,并会忽略 SQL_LOGICAL_CHAR 设置。

如果客户机会话连接至在数据库创建时已启用 SQL_LOGICAL_CHAR 配置参数的数据库,那么此设置会在连接时生效。即使管理数据库的 GBase 8s 实例已停止并以新的 SQL_LOGICAL_CHAR 设置重新启动,该数据库的 SQL_LOGICAL_CHAR 设置也无法更改,并会一直保持到数据库删除为止。

无论 SQL_LOGICAL_CHAR 配置参数设置为启用还是禁用已声明存储大小的扩展,其设置都会指定如何为 GBase 8s 实例的所有会话解释数据类型声明。

对于 ESQL/C 之类的嵌入式语言,字符数据类型声明会在由客户机应用程序传递给 GBase 8s 时进行扩展。