跳到主要内容

DAMERAU_LEVENSHTEIN_DISTANCE

描述

DAMERAU_LEVENSHTEIN_DISTANCE 函数用于计算两个字符串之间的 Damerau-Levenshtein 编辑距离

Damerau-Levenshtein 编辑距离表示将一个字符串转换为另一个字符串所需的最少单字符编辑次数。支持的编辑操作包括:

  • 插入一个字符
  • 删除一个字符
  • 替换一个字符
  • 交换两个相邻字符

LEVENSHTEIN 相比,DAMERAU_LEVENSHTEIN_DISTANCE 将相邻字符交换视为一次编辑操作,因此更适合处理由于字符顺序颠倒造成的输入错误。例如,abcdabdc 之间只需要交换相邻的 cd,Damerau-Levenshtein 距离为 1,而 Levenshtein 距离为 2。

该函数按 UTF-8 字符计算距离,而不是按字节计算。因此,多字节字符(例如中文字符)会被视为一个字符。

语法

DAMERAU_LEVENSHTEIN_DISTANCE(<str1>, <str2>)

参数

参数说明
<str1>第一个字符串。类型:VARCHAR
<str2>第二个字符串。类型:VARCHAR

返回值

返回 INT 类型,表示两个字符串之间的 Damerau-Levenshtein 编辑距离。

特殊情况:

  • 如果任意参数为 NULL,返回 NULL。
  • 如果两个字符串相同,返回 0。
  • 如果其中一个字符串为空字符串,返回另一个字符串的字符数。
  • 该函数满足交换律,即 DAMERAU_LEVENSHTEIN_DISTANCE(a, b)DAMERAU_LEVENSHTEIN_DISTANCE(b, a) 返回相同结果。
  • 当输入过大导致内部距离矩阵超过限制时,函数会返回错误。

示例

  1. 基本用法
SELECT damerau_levenshtein_distance('kitten', 'sitting');
+---------------------------------------------------+
| damerau_levenshtein_distance('kitten', 'sitting') |
+---------------------------------------------------+
| 3 |
+---------------------------------------------------+
  1. 相邻字符交换
SELECT damerau_levenshtein_distance('abcd', 'abdc');
+----------------------------------------------+
| damerau_levenshtein_distance('abcd', 'abdc') |
+----------------------------------------------+
| 1 |
+----------------------------------------------+

abcd 可以通过交换相邻的 cd 变为 abdc,因此距离为 1。

  1. LEVENSHTEIN 的差异
SELECT levenshtein('abcd', 'abdc'), damerau_levenshtein_distance('abcd', 'abdc');
+-----------------------------+----------------------------------------------+
| levenshtein('abcd', 'abdc') | damerau_levenshtein_distance('abcd', 'abdc') |
+-----------------------------+----------------------------------------------+
| 2 | 1 |
+-----------------------------+----------------------------------------------+

LEVENSHTEIN 不支持交换操作,因此需要 2 次编辑;DAMERAU_LEVENSHTEIN_DISTANCE 支持相邻交换,因此只需要 1 次编辑。

  1. UTF-8 字符
SELECT damerau_levenshtein_distance('你好', '好你');
+--------------------------------------------------+
| damerau_levenshtein_distance('你好', '好你') |
+--------------------------------------------------+
| 1 |
+--------------------------------------------------+

是两个 UTF-8 字符,交换相邻字符需要 1 次编辑。

  1. 插入、删除、替换
SELECT
damerau_levenshtein_distance('', 'abc'),
damerau_levenshtein_distance('数据库', '数据'),
damerau_levenshtein_distance('flaw', 'lawn');
+-----------------------------------------+-----------------------------------------------------+----------------------------------------------+
| damerau_levenshtein_distance('', 'abc') | damerau_levenshtein_distance('数据库', '数据') | damerau_levenshtein_distance('flaw', 'lawn') |
+-----------------------------------------+-----------------------------------------------------+----------------------------------------------+
| 3 | 1 | 2 |
+-----------------------------------------+-----------------------------------------------------+----------------------------------------------+
  1. 完整 Damerau-Levenshtein 距离示例
SELECT damerau_levenshtein_distance('CA', 'ABC');
+-------------------------------------------+
| damerau_levenshtein_distance('CA', 'ABC') |
+-------------------------------------------+
| 2 |
+-------------------------------------------+

该函数计算完整 Damerau-Levenshtein 距离。对于 CAABC,最少编辑次数为 2。

  1. NULL 参数
SELECT damerau_levenshtein_distance(NULL, 'abc'), damerau_levenshtein_distance('abc', NULL);
+-------------------------------------------+-------------------------------------------+
| damerau_levenshtein_distance(NULL, 'abc') | damerau_levenshtein_distance('abc', NULL) |
+-------------------------------------------+-------------------------------------------+
| NULL | NULL |
+-------------------------------------------+-------------------------------------------+
  1. 输入过大
SELECT damerau_levenshtein_distance(repeat('a', 4096), repeat('b', 4096));
ERROR 1105 (HY000): errCode = 2, detailMessage = (127.0.0.1)[INVALID_ARGUMENT]damerau_levenshtein_distance distance matrix is too large: 16793604 cells exceeds limit 16777216