DAMERAU_LEVENSHTEIN_DISTANCE
説明
DAMERAU_LEVENSHTEIN_DISTANCE 関数は、二つの文字列間の Damerau-Levenshtein 編集距離を計算します。
Damerau-Levenshtein 編集距離は、一方の文字列をもう一方の文字列に変換するために必要な、一文字単位の編集操作の最小回数です。次の編集操作に対応しています。
- 文字の挿入
- 文字の削除
- 文字の置換
- 隣接する二つの文字の入れ替え
LEVENSHTEIN と異なり、DAMERAU_LEVENSHTEIN_DISTANCE は隣接する文字の入れ替えを一回の編集操作として扱うため、文字の順序が逆になった入力ミスを扱うのに適しています。たとえば、abcd を abdc に変換するには、隣接する c と d を入れ替えるだけでよいため、Damerau-Levenshtein 距離は 1、Levenshtein 距離は 2 です。
この関数はバイト単位ではなく UTF-8 文字単位で距離を計算します。そのため、中国語の漢字などのマルチバイト文字も一文字として扱います。
4.2.0 以降
構文
DAMERAU_LEVENSHTEIN_DISTANCE(<str1>, <str2>)
パラメータ
| パラメータ | 説明 |
|---|---|
<str1> | 一つ目の文字列。型: VARCHAR |
<str2> | 二つ目の文字列。型: VARCHAR |
戻り値
二つの文字列間の Damerau-Levenshtein 編集距離を表す INT 値を返します。
特殊なケース:
- いずれかの引数が NULL の場合は、NULL を返します。
- 二つの文字列が同じ場合は、0 を返します。
- 一方の文字列が空の場合は、もう一方の文字列の文字数を返します。
- この関数には対称性があり、
DAMERAU_LEVENSHTEIN_DISTANCE(a, b)とDAMERAU_LEVENSHTEIN_DISTANCE(b, a)は同じ結果を返します。 - 入力が大きすぎて内部の距離行列が上限を超える場合は、エラーを返します。
例
- 基本的な使い方
SELECT damerau_levenshtein_distance('kitten', 'sitting');
+---------------------------------------------------+
| damerau_levenshtein_distance('kitten', 'sitting') |
+---------------------------------------------------+
| 3 |
+---------------------------------------------------+
- 隣接する文字の入れ替え
SELECT damerau_levenshtein_distance('abcd', 'abdc');
+----------------------------------------------+
| damerau_levenshtein_distance('abcd', 'abdc') |
+----------------------------------------------+
| 1 |
+----------------------------------------------+
abcd から abdc への変換では、隣接する c と d を入れ替えるだけなので、距離は 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 回の編集操作で済みます。
- UTF-8 文字
SELECT damerau_levenshtein_distance('你好', '好你');
+--------------------------------------------------+
| damerau_levenshtein_distance('你好', '好你') |
+--------------------------------------------------+
| 1 |
+--------------------------------------------------+
你 と 好 は二つの UTF-8 文字であり、隣接する文字を入れ替える操作は 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 |
+-----------------------------------------+-----------------------------------------------------+----------------------------------------------+
- 完全な Damerau-Levenshtein 距離の例
SELECT damerau_levenshtein_distance('CA', 'ABC');
+-------------------------------------------+
| damerau_levenshtein_distance('CA', 'ABC') |
+-------------------------------------------+
| 2 |
+-------------------------------------------+
この関数は完全な Damerau-Levenshtein 距離を計算します。CA と ABC の最小編集距離は 2 です。
- NULL 引数
SELECT damerau_levenshtein_distance(NULL, 'abc'), damerau_levenshtein_distance('abc', NULL);
+-------------------------------------------+-------------------------------------------+
| damerau_levenshtein_distance(NULL, 'abc') | damerau_levenshtein_distance('abc', NULL) |
+-------------------------------------------+-------------------------------------------+
| NULL | NULL |
+-------------------------------------------+-------------------------------------------+
- 入力が大きすぎる場合
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