COERCIBILITY
声明
COERCIBILITY(str)
说明
返回字符串 str 在多语言排序时字符序的优先级。
相同字符集的两个变量在进行比较时,按字符序作为规则。但不同字符集的两个变量时,就需要规定不同字符集间的优先级。例如以下语句:
SELECT c1 FROM t WHERE c1 = 'Y';
如果 c1 与 'Y' 使用相同的字符序,则不会产生歧义。但如果表 t 在 table_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; -
对于相同字符集,但字符序分别是
_bin与a_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)