当比较 CHAR 类型(CHAR、VARCHAR、LONG VARCHAR)和 NCHAR 类型(NCHAR、NVARCHAR、LONG NVARCHAR)的值时,SQL Anywhere 将使用推导规则来决定执行比较时所使用的类型。通常,如果一个值基于列引用而另一个值不是,则将以包含列引用的值的类型执行比较。
推导规则主要是判断一个值是否基于列引用建立。如果一个值是不基于列引用的变量、主机变量、文字常量或复杂表达式而另一个值基于列引用,则基于常量的值将隐式地转换为基于列的值的类型。
下面按适用顺序列出推导规则:
如果 NCHAR 值基于列引用,则 CHAR 将隐式地转换为 NCHAR,并以 NCHAR 执行比较。这包括 NCHAR 和 CHAR 都基于列引用的情况。
如果 NCHAR 值不基于列引用,但 CHAR 值基于列引用,则 NCHAR 值将隐式地转换为 CHAR,并且以 CHAR 执行比较。
如果您预计有 NCHAR 到 CHAR 的转换,考虑 on_charset_conversion_failure 选项的设置很重要,因为此选项控制不能在 CHAR 字符集中表示 NCHAR 字符时的行为。有关详细说明,请参见将 NCHAR 转换为 CHAR。
如果两者的值都不基于列引用,则 CHAR 将隐式地转换为 NCHAR,并以 NCHAR 执行比较。
条件 Employees.GivenName = N'Susan'
将 CHAR 列 (Employees.GivenName) 与文字 N'Susan' 作比较。值 N'Susan' 会先转换为 CHAR,然后再执行比较,就如同将比较写为:
Employees.GivenName = CAST( N'Susan' AS CHAR ) |
或者,在条件 Employees.GivenName = T.nchar_column
中,值 T.nchar_column 不会转换为 CHAR。比较的执行就好像按如下方法编写比较(不能使用 Employees.GivenName 上的索引):
CAST( Employees.GivenName AS NCHAR ) = T.nchar_column; |
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |