メインコンテンツまでスキップ
に最終更新

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) は同じ結果を返します。
  • 入力が大きすぎて内部の距離行列が上限を超える場合は、エラーを返します。

例​

  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 から abdc への変換では、隣接する c と d を入れ替えるだけなので、距離は 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 距離を計算します。CA と ABC の最小編集距離は 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