指定了 UPPER 和 LOWER 大小写转换函数来支持在区分大小写的数据库中的区分大小写查询。在有 NLSCASE INSENSITIVE 属性的数据库中不经常需要他们,因为无需调用这些函数,NCHAR
和 NVARCHAR 数据类型就支持区分大小写的查询。您可在 NLSCASE INSENSITIVE 数据库中调用大小写转换函数,它们对 CHAR、LVARCHAR
和 VARCHAR 数据类型的影响与在区分大小写的数据库中相同。
在以 NLSCASE INSENSITIVE 选项创建的数据库中,数据库服务器不理会 NCHAR 和 NVARCHAR 值的字母大小写。调用大小写转换函数的表达式可返回的结果可与区分大小写的数据库会返回的不同,如果该表达式引用
NCHAR 或 NVARCHAR 对象,或如果数据库服务器以显式的或隐式的强制转型将该表达式求值为 NCHAR 或 NVARCHAR 数据类型的话。
当在带有 NLSCASE INSENSITIVE 属性的数据库中使用
UPPER、
LOWER 或
INITCAP 函数对字符串表达式求值时,数据库服务器调用该函数,并对它的返回值应用数据类型提升规则,在主题
来自 CONCAT 和字符串函数的返回类型 中总结该规则。
- 如果该表达式求值为 CHAR、LVARCHAR 或 VARCHAR 数据类型,则数据库服务器可使用区分大小写的操作中的结果,如果那些操作不涉及 NCHAR 或 NVARCHAR
对象的话。
- 在执行了 UPPER、LOWER 或 INITCAP 函数之后,如果该表达式求值为 NCHAR 或 NVARCHAR 值,则在使用来自该表达式的此返回值的后续操作中,不理会在此结果中的字母的大小写。
下列示例说明在 NLSCASE INSENSITIVE 数据库中的此行为,其中表
t1 有这五个内建的字符数据类型的字符列。该表存储三行,其中每一列存储 3 个字母字符串的相同大小写的形式:
CREATE DATABASE db NLSCASE INSENSITIVE;
CREATE TABLE t1 (
c1 NCHAR(20),
c2 NVARCHAR(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');
在下列示例中,数据库服务器将 UPPER 函数应用到 NCHAR 列 c1,然后对于 'IBM' 字符串常量相匹配的列中返回的所有值应用区分大小写的规则。
SELECT c1 FROM t1 WHERE UPPER(c1) = 'IBM';
由于在此数据库中 NCHAR 值时不区分大小写的,因此该查询从表中的每行返回列
c1 值,由于在每一行中字母的序列与字符串常量相匹配,使用忽略该列值的字母大小写的不区分大小写的规则:
c1
ibm
Ibm
IBM
在相同的表上,通过对同一查询的下列修改,也会返回相同的结果集(即
'ibm'、
'Ibm' 和
'IBM'):
- 如果 projection 子句指定了任何其他列,而不是 c1,因为每行存储相同的值,且对于此数据库中字符串 'IBM'
的所有大小写变化形式,UPPER 返回的 NCHAR 值使得 WHERE 子句为真。
- 如果 WHERE 子句中的 'IBM' 字符串是相同的字符序列的任何其他字母大小写变化形式,因为在此数据库中区分大小写的规则不处理 NCHAR
数据类型。
- 如果大小写转换函数的参数是 NVARCHAR 列 c2,而不是 NCHAR 列 c1,因为在此数据库中 NCHAR 或 NVARCHAR 都是不区分大小写的数据类型。
- 如果将大小写转换函数 LOWER 或 INITCAP,而不是 UPPER,应用于列 c1,因为在此数据库中,那个 NCHAR 列的每个(大小写变化形式)值都与 'IBM' 相匹配。
- 如果未调用大小写转换函数,但 WHERE 条件反而指定了 c1 = 'IBM',因为在此 NLSCASE INSENSITIVE 数据库中,大小写转换函数作为查询过滤器对 NCHAR 或 NVARCHAR 参数不起作用。