在 NLSCASE INSENSITIVE 数据库中的数据类型提升

在有 NLSCASE INSENSITIVE 属性的数据库中,数据库服务器丢弃 NCHAR 和 NVARCHAR 值的大写字母。通过执行隐式的强制转型来在其中避免函数或运算符溢出错误的表达式,可产生与区分大小写的数据库会返回的结果不同的结果,如果该表达式求值为 NCHAR 或 NVARCHAR 数据类型的话。

当数据库服务器在其上支持数据类型提升的字符串函数或字符串运算符返回一值,对于该表达式的缺省的 VARCHAR 或 NVARCHAR 数据类型会产生溢出错误时,数据库服务器在返回值上执行隐式的强制转型,如同主题 来自 CONCAT 和字符串函数的返回类型 的第一张表格表明的那样:

在有 NLSCASE INSENSITIVE 属性的数据库中,对 CHAR、LVARCHAR 或 VARCHAR 数据类型的操作是区分大小写的,但对 NCHAR 或 NVARCHAR 数据类型的操作不区分大小写。数据类型提升还从包括 CHAR、LVARCHAR 或 VARCHAR 分量的表达式的求值产生不区分大小写的结果(而不是区分大小写),如果同一表达式还包括 NCHAR 或 NVARCHAR 字符串的话。

下列示例说明在 NLSCASE INSENSITIVE 数据库中的此行为,其中的表 t1 有五个字符列,对应五种内建的字符数据类型。该表存储三行,其中的每一列存储 3 个字母字符串的同一字母大小写变量:
CREATE DATABASE db NLSCASE INSENSITIVE;
        CREATE TABLE t1 (
        c1 NCHAR(20), 
        c2 NVARCHAR(20), 
        c3 CHAR((20), 
        c4 VARCHAR(20),  
        c5 LVARCHAR(20)) ;
        INSERT INTO t1 values ('ibm', 'ibm', 'ibm', 'ibm', 'ibm');
        INSERT INTO t1 values ('Ibm', 'Ibm', 'Ibm', 'Ibm', 'Ibm');
        INSERT INTO t1 values ('IBM', 'IBM', 'IBM', 'IBM', 'IBM');

下列查询使用其字母均为小写的文字字符串的相等谓词,从 NCHAR 列检索值:

SELECT c1 FROM t1 WHERE c1 = 'ibm';
由于在此数据库中 NCHAR 值不区分大小写,因此该查询从每一行返回列 c1 值:
c1
        
        ibm
        Ibm
        IBM

下列对同一表的查询从 WHERE 子句将其强制转型为 NCHAR 值的 CHAR 列 c3,返回相同的不区分大小写的结果:

SELECT c1 FROM t1 WHERE c3 = 'ibm'::NCHAR(10);
在强制转型之后,c3 值不区分大小写,因此,c3 中的每行都与字符串 'ibm' 相匹配,且对于 c1 中的每行,WHERE 条件都为真:
c1
        
        ibm
        Ibm
        IBM

如同在前面的示例中那样,在相同的序列中出现相同的字母的字符串之中,由于不区分大小写的操作丢弃字母大小写的差异,因此在有 NLSCASE INSENSITIVE 属性的数据库中,请留意避免将不区分大小写的规则应用到您期望区分大小写的操作的数据类型提升上下文。

另请参阅 在 NLSCASE INSENSITIVE 数据库中重复的行 部分。