SQL 函数:传入具有 upperlowertrim 排序规则说明符的列

注意

此行为变更在 2024_02 捆绑包中。

有关捆绑包的当前状态,请参阅 捆绑包历史记录

upperlower :ref:` 排序规则说明符 <label-collation_specification>` 会在比较字符串之前,将字符串分别转换为大写或小写。trim 排序规则说明符在比较字符串之前,会移除前导空格和末尾空格。

在将带有这些说明符的列传传入某些 SQL 函数时,行为变更如下:

变更前:

LIKE 函数会忽略 upperlowertrim 说明符,这会导致比较区分大小写。

此外,以下函数不支持带有 upperlowertrim 说明符的列:

如果传入带有 upperlowertrim 说明符的列,将发生编译错误。

变更后:

LIKE 函数遵循 upperlowertrim 说明符,这会导致比较不区分大小写。

因此,使用 LIKE 函数的查询可能会返回额外的行(请参阅以下示例)。

请注意,LIKE 函数不支持与区域设置说明符组合(例如,en-upper)。

此外,以下函数现在支持带有 upperlowertrim 说明符的列:

  • LIKE 函数的变体:

    • LIKE ALL

    • LIKE ANY

    • ILIKE ANY

  • CONTAINS

  • ENDSWITH

  • POSITION

  • REPLACE

  • SPLIT

  • SPLIT_PART

  • STARTSWITH

LIKE 函数变更的影响示例

如上所述,如果某个列具有 upperlowertrim 说明符,则使用 LIKE 函数的查询可能会返回额外的行。例如,假设某个表具有带 lower 说明符的列。假设表中的文字大小写不同。

CREATE OR REPLACE TABLE collated_like (
  col_a VARCHAR,
  col_b VARCHAR COLLATE 'lower'
);

INSERT INTO collated_like VALUES ('abc', 'abc'), ('ABC','ABC');
Copy

在行为变更之前,以下每个查询都使用 LIKE 函数返回一行,其值为 'abc'

SELECT * FROM collated_like WHERE col_a LIKE '%b%';

SELECT * FROM collated_like WHERE col_a COLLATE 'lower' LIKE '%b%';

SELECT * FROM collated_like WHERE col_b LIKE '%b%';
Copy
+-------+-------+
| COL_A | COL_B |
|-------+-------|
| abc   | abc   |
+-------+-------+

行为变更后,不使用 lower 规范列和 LIKE 函数的列将仍然返回一行:

SELECT * FROM collated_like WHERE col_a LIKE '%b%';
Copy
+-------+-------+
| COL_A | COL_B |
|-------+-------|
| abc   | abc   |
+-------+-------+

但是,使用 COLLATE 函数指定 lower 的查询以及将带有 lower 规范的例如传入 LIKE 函数的查询将返回两行:

SELECT * FROM collated_like WHERE col_a COLLATE 'lower' LIKE '%b%';

SELECT * FROM collated_like WHERE col_b LIKE '%b%';
Copy
+-------+-------+
| COL_A | COL_B |
|-------+-------|
| abc   | abc   |
| ABC   | ABC   |
+-------+-------+

这大致相当于 ILIKE。要确定是否应预期这些查询的变更,可以在这些查询中将 LIKE 替换为 ILIKE。

保留变更前的行为

如果列使用 upperlowertrim 规范,并且您希望保留变更前的行为,则可以使用 COLLATE 函数和空规范,来指明不应使用与列相关的 upperlowertrim 规范:

SELECT * FROM collated_like WHERE col_b COLLATE '' LIKE '%b%';
Copy

备注

如果您将此方法与 LIKE 函数搭配使用,请确保主题和模式均未应用排序规则规范。

参考:1535

语言: 中文