指定 NLSCASE 区分大小写

您可以显式地创建区分大小写或不区分大小写的数据库。

缺省情况下,在数据库中的区域设置将代码集的分离子集分类为大写字母小写字母 GBase 8s 数据库创建为区分大小写。数据库语言环境通过设置 DB_LOCALE 环境变量而定义。语言环境的示例,若其代码集在缺省 US English 语言环境中识别字母大小写,则在升序排列中,小写字母会超过大写字母。在缺省的语言环境中,以下语句创建区分大小写的数据库:
 CREATE DATABASE employees IN dbspaceYee WITH BUFFERED LOG; 
要显式地创建区分大小写的数据库,请将 NLSCASE SENSITIVE 关键字包含在 CREATE DATABASE 语句中,并作为其最后的指示,如下所示:
CREATE DATABASE stores IN dbsp1 WITH LOG NLSCASE SENSITIVE; 
因为缺省启用区分大小写,以下语句具有相同的作用:
CREATE DATABASE stores IN dbsp1 WITH LOG; 

在区分大小写的数据库中,例如 Boolean 条件 'M' MATCHES 'm' 计算为假。

所有的 GBase 8s 数据库对于内置 CHAR 、LVARCHAR 和 VARCHAR 数据类型的字符串字符操作都区分大小写。如果您创建区分大小写数据库,则不论缺省或显式使用 NLSCASE SENSITIVE 关键字,如果数据库语言环境支持字母大小写,数据库仍将区域语言支持的数据类型 NCHAR 和 NVARCHAR 看作区分大小写。

创建不区分大小写的数据库

在某些应用程序中,字符串的大小写会被忽略。 例如,数据项处理,可能接受字符串 'M''m' 在一条记录中是逻辑等价的。对于大数据集,应用条件逻辑将两种情况变量转换为单个值可能导致性能低于将记录存储在不区分大小写的数据库的 NCHAR 或 NVARCHAR 列中,其中 'M''m' 字符串编码都是不区分大小写的值此处的条件 'M' MATCHES 'm' 对 NCHAR 或 NVARCHAR 列计算为真。

每个创建有 NLSCASE INSENSITIVE 属性的数据库存储大小写的 NCHAR 和 NVARCHAR 字母,正如它们被加载到它们的表中一样;查询返回的任何未更改的记录都具有原始字母。然而,在所有的对 NCHAR 和 NVARCHAR 值的操作(例如:排序、分组或标识重复行)中,数据库服务器会忽略字母大小写的变化,例如:字符串 'Mi''mI' 的值是一样的。有关字母大小写的信息没有被丢弃,但是当数据库服务器处理 NLS 数据类型时仍不会使用这些信息。

当在 CREATE DATABASE 语句中包含 NLSCASE INSENSITIVE 关键字作为其最后的指定时,数据库服务创建处理以下字符串类型时不考虑字母大小写的数据库:

  • 存储在 NLS 数据类型的 NCHAR 和 NVARCHAR 列中字符串
  • 存储为基于 NCHAR 或 NVARCHAR 数据类型的 DISTINCT 数据类型的字符串
  • 存储为具有集合数据类型的那些数据类型的元素的字符串
  • 存储在指定或未指定的 ROW 数据类型中的以上数据类型的字段中字符串
  • 存储为 SPL 变量的那些数据类型的字符串
  • 隐式或显示强制转型为那些数据类型的字符串
  • 作为被函数返回的那些数据类型的输出参数的字符串
此处的 "这些数据类型" 引用了在同一列表中标识的字符数据类型。
以下语句创建了具有 NLSCASE INSENSITIVE 属性的数据库:
CREATE DATABASE stores IN dbsp2 WITH BUFFERED LOG NLSCASE INSENSITIVE;
重要: 创建为 NLSCASE INSENSITIVE 的数据库将所有其它内置字符数据类型(CHAR 、LVARCHAR 和 VARCHAR)都对待为区分大小写。也就是说,如果它们的数据类型不在上表的 NLS 字符数据类型中,则区分大小写的数据库仍可以执行区分大小写字符串值的处理。

要在区分大小写的数据库的 NCHAR 或 NVARCHAR 数据类型的字符串上执行区分大小写操作,您必须显式地将字符串强制转型成 CHAR 、LVARCHAR 或 VARCHAR 数据类型,然后再执行区分大小写操作。

NLSCASE INSENSITIVE 查询的示例

在区分大小写的数据库中,当一个查询调用聚集函数或者对 NCHAR 或 NVARCHAR 列包含 GROUP BY 子句时,数据库服务器将数据库中的大小写字母作为重复的值,程序片段示例如下。

  CREATE DATABASE casedb WITH LOG NLSCASE INSENSITIVE;
        CREATE TABLE foo (cc CHAR(5), nc NCHAR(5));
        INSERT INTO foo VALUES ('IBM', 'iBM');
        INSERT INTO foo VALUES ('ibm', 'ibM');
        INSERT INTO foo VALUES ('ibm', 'ibM');
        INSERT INTO foo VALUES ('Ibm', 'Ibm');
        
        SELECT COUNT(nc) FROM foo 
        GROUP BY nc;
        SELECT COUNT(nc) FROM foo 
        WHERE nc = 'ibm' GROUP BY nc;

在以上两条查询中,COUNT 聚集函数都返回 4 ,是 INSERT 语句加载到 foo 中的总行数。因为 nc 列是 NLS 数据类型,所有的行都满足 WHERE 子句中的 nc = 'ibm' 条件,尽管在 nc 值中有字母大小写的变化。

在同一表上执行以下查询,
SELECT nc FROM foo GROUP BY nc;
输出可能是来自 INSERT 语句的任何字符串值(亦即 'IBM''iBM''ibm''ibM''Ibm'),这取决于服务器处理或扫描行的顺序。
在同一表上的下一查询,通过在投影子句中包含 DISTINCT 关键字从结果集排除了重复的行:
SELECT DISTINCT nc FROM foo;
此处返回一行,因为从 NLSCASE INSENSITIVE 角度来看,所有的行具有相同的值,尽管在字母大小写上有变化。正如先前的示例,从插入的行中检索到的第一行将由查询返回。
以下示例包含 DISTINCT 关键字,将其作为 COUNT 聚集函数其中的一个参数:
SELECT COUNT(DISTINCT nc) FROM foo;
此处还是返回计数 1,因为在此不区分大小写的数据库中,foo 表中所有的行都评估为重复行。

NLSCASE INSENSITIVE 数据库的限制

以下限制应用于创建 NLSCASE INSENSITIVE 属性的数据库:
  • 它们支持只与拥有 NLSCASE INSENSITIVE 属性的数据库的分布跨数据库和跨服务器查询。
  • 区分大小写的数据库无法连接到 NLSCASE INSENSITIVE 数据库。若要尝试此操作,则会产生以下错误:
    -26801 Cannot reference an external database that is not case sensitive.
  • NLSCASE INSENSITIVE 数据库无法连接到区分大小写的数据库。若要尝试此操作,则会产生以下错误:
    -26802 Cannot reference an external database that is case sensitive.
                  
    唯一的例外是,NLSCASE 设置不会阻止同一 GBase 8s 数据库服务器实例到区分大小写系统数据库(例如 sysmastersysadminsysutilssysuserssyscdr)的连接。存取系统数据库操作的结果依赖于其它数据库中的 NLSCASE 设置。
  • onloadonunload 实用程序不支持具有 NLSCASE INSENSITIVE 属性的数据库。
  • 在 Enterprise Replication 集群中,当您在不同于它们 NLSCASE 属性的数据库中指定了复制对时,不会发出错误或警告。要降低不一致性的风险,复制只与区分大小写的数据库区分大小写的数据库,复制只与 NLSCASE INSENSITIVE 的数据库 NLSCASE INSENSITIVE 数据库。