MariaDB WEIGHT_STRING() 函数使用指南

在 MariaDB 中,WEIGHT_STRING() 是一个内置函数,它返回表示输入字符串的比较和排序权重的二进制字符串。

如果输入字符串是非二进制值,则返回值包含字符串的排序规则权重。如果是二进制值,则结果与输入字符串相同。这是因为二进制字符串中每个字节的权重是字节值。

此函数是供内部使用的调试函数。它可用于测试和调试排序规则。

MariaDB WEIGHT_STRING() 语法

这里是 MariaDB WEIGHT_STRING() 函数的语法:

WEIGHT_STRING(str [AS {CHAR|BINARY}(N)] [LEVEL levels] [flags])
  levels: N [ASC|DESC|REVERSE] [, N [ASC|DESC|REVERSE]] ...

参数

str
必需的。要计算权重的字符串。

以下是每个参数/子句的说明。

AS {CHAR|BINARY}(N)

可选的。 AS 子句允许将输入字符串转换为二进制或非二进制字符串以及特定长度。

  • AS CHAR(N) 以字符为单位测量长度,并在右边填充空格到所需的长度。
  • AS BINARY(N) 以字节而不是字符为单位测量长度,并在右边填充 0x00 到所需的长度。

N 的最小值为 1,如果它小于输入字符串的长度,则该字符串将被截断而不发出警告。

LEVEL levels

可选的。 指定返回值应包含特定排序规则级别的权重。

levels 说明符可以是单个整数、逗号分隔的整数列表或用短划线分隔的整数范围(忽略空格)。整数的范围可以从 1 到最大值 6,具体取决于排序规则,并且需要按升序列出。

  • 如果未提供 LEVEL 子句,则假定排序规则的默认值 1 为最大值。
  • 如果在不使用范围的情况下指定了 LEVEL,则允许使用可选修饰符。
  • ASC(默认值)返回不进行任何修改的权重。
  • DESC 返回按位反转权重。
  • REVERSE 以相反的顺序返回权重。

如果您不提供参数或提供了错误数量的参数,MariaDB 将报告一个错误:ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ')' at line 1

返回值

在 MariaDB 中,WEIGHT_STRING() 是一个内置函数,它返回表示输入字符串的比较和排序权重的二进制字符串。

如果输入字符串是非二进制值,则返回值包含字符串的排序规则权重。如果是二进制值,则结果与输入字符串相同。这是因为二进制字符串中每个字节的权重是字节值。

MariaDB WEIGHT_STRING() 示例

基本示例

这个语句展示了 MariaDB WEIGHT_STRING() 函数的基本用法:

SELECT HEX(WEIGHT_STRING('A'));

输出:

+-------------------------+
| HEX(WEIGHT_STRING('A')) |
+-------------------------+
| 0041                    |
+-------------------------+

在这里,我们使用 HEX() 函数以十六进制格式表示不可打印的结果。

AS 子句

下面是一个使用 AS 子句将输入字符串强制转换为给定类型和长度的示例。

SET @str = 'a';
SELECT
  HEX(WEIGHT_STRING(@str AS CHAR(3))) 'Char 3',
  HEX(WEIGHT_STRING(@str AS CHAR(5))) 'Char 5',
  HEX(WEIGHT_STRING(@str AS BINARY(3))) 'Binary 3',
  HEX(WEIGHT_STRING(@str AS BINARY(5))) 'Binary 5'\G

输出:

  Char 3: 004100200020
  Char 5: 00410020002000200020
Binary 3: 610000
Binary 5: 6100000000

排序规则

以下两个示例演示字符串如何具有不同的权重字符串,具体取决于所使用的排序规则。

第一个示例中使用的排序规则不区分大小写。第二个示例中使用的排序规则区分大小写。

SET @upper = _latin1 'HELLO' COLLATE latin1_general_ci;
SET @lower = lcase(@upper);
SELECT
  @upper 'String',
  HEX(@upper) 'Hex',
  HEX(WEIGHT_STRING(@upper)) 'Weight String'
UNION ALL
SELECT
  @lower,
  HEX(@lower),
  HEX(WEIGHT_STRING(@lower));

输出:

+--------+------------+---------------+
| String | Hex        | Weight String |
+--------+------------+---------------+
| HELLO  | 48454C4C4F | 695B797981    |
| hello  | 68656C6C6F | 695B797981    |
+--------+------------+---------------+

第二个示例几乎相同,除了使用区分大小写的排序规则。

SET @upper = _latin1 'HELLO' COLLATE latin1_general_cs;
SET @lower = lcase(@upper);
SELECT
  @upper 'String',
  HEX(@upper) 'Hex',
  HEX(WEIGHT_STRING(@upper)) 'Weight String'
UNION ALL
SELECT
  @lower,
  HEX(@lower),
  HEX(WEIGHT_STRING(@lower));

输出:

+--------+------------+---------------+
| String | Hex        | Weight String |
+--------+------------+---------------+
| HELLO  | 48454C4C4F | 695B797981    |
| hello  | 68656C6C6F | 6A5C7A7A82    |
+--------+------------+---------------+

结论

在 MariaDB 中,WEIGHT_STRING() 是一个内置函数,它返回表示输入字符串的比较和排序权重的二进制字符串。