跳到主要内容

COERCIBILITY

声明

COERCIBILITY(str)

说明

返回字符串 str 在多语言排序时字符序的优先级。

相同字符集的两个变量在进行比较时,按字符序作为规则。但不同字符集的两个变量时,就需要规定不同字符集间的优先级。例如以下语句:

SELECT c1 FROM t WHERE c1 = 'Y';

如果 c1'Y' 使用相同的字符序,则不会产生歧义。但如果表 ttable_option 指定了其他的字符序,或系统变量 collation_connection 使用了不同的字符序,则在比较时使用的哪种字符序,取决于两种字符序的优先级。

各类字符序的优先级如下表所示,值越小优先级越高。

取值描述例子
0显式指定的字符序显式 COLLATE 子句。
1无字符序不同字符序字符串的连接。
2隐式指定的字符序列值、系统参数或变量。
3系统常数系统函数例如 USER() 函数的返回值。
4可降级值文字字符串。
5数字型值数值或时间值。
6可忽略的值NULL 或结果为 NULL 的表达式。

seekdb 使用 Coercibility 值和以下规则来解决歧义:

  • Coercibility 越小,优先级越高。

  • 如果比较的双方具有相同的 Coercibility 的排序规则,则使用以下补充规则:

    • 如果两种字符集都是 Unicode 或都不是 Unicode,字符序不同则返回错误。

    • 如果一侧字符集使用了 Unicode,另一侧字符集不是 Unicode,则 Unicode 的一侧具有更高的优先级。例如以下语句不会返回错误:

      SELECT CONCAT(t1.utf8_column, t2.gbk_column) FROM t1,t2;
    • 对于相同字符集,但字符序分别是 _bina_ci_cs,则使用 _bin 字符序。

示例

SELECT COERCIBILITY('oceanbase' COLLATE utf8mb4_bin);
+-----------------------------------------------+
| COERCIBILITY('oceanbase' COLLATE utf8mb4_bin) |
+-----------------------------------------------+
| 0 |
+-----------------------------------------------+
1 row in set (0.001 sec)

SELECT COERCIBILITY('oceanbase');
+---------------------------+
| COERCIBILITY('oceanbase') |
+---------------------------+
| 4 |
+---------------------------+
1 row in set (0.001 sec)

SELECT COERCIBILITY(user());
+----------------------+
| COERCIBILITY(user()) |
+----------------------+
| 3 |
+----------------------+
1 row in set (0.001 sec)

SELECT COERCIBILITY(1000);
+--------------------+
| COERCIBILITY(1000) |
+--------------------+
| 5 |
+--------------------+
1 row in set (0.001 sec)