Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (中文) » SQL Anywhere 服务器 - SQL 参考 » 使用 SQL » SQL 数据类型 » 数据类型转换 » 数据类型之间的比较

 

CHAR 和 NCHAR 之间的比较

当比较 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;
另请参见