> ## Documentation Index
> Fetch the complete documentation index at: https://villagesql.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# MySQL 的 vsql_fuzzystrmatch 扩展

> vsql_fuzzystrmatch 扩展为 MySQL 添加 Soundex、Metaphone、Double Metaphone 和 Levenshtein 编辑距离，用于姓名匹配和去重。

`vsql_fuzzystrmatch` 是 PostgreSQL `fuzzystrmatch` 扩展的移植版本。
它回答关于一对字符串的两个不同问题：它们听起来是否相似，以及它们之间
相差多少次编辑。可用于姓名匹配、拼写纠正，以及对手工录入的记录去重。

| | |
| - | - |
| **维护者** | VillageSQL |
| **源代码和完整文档** | [villagesql/vsql-fuzzystrmatch](https://github.com/villagesql/vsql-fuzzystrmatch) |
| **许可证** | GPL-2.0 |

## 安装

如果您使用安装脚本、Docker 镜像或发行版压缩包安装了 VillageSQL，
`vsql_fuzzystrmatch.veb` 已经位于服务器的 `lib/veb/` 目录中。
用一条语句将它安装到服务器中：

```sql theme={null}
INSTALL EXTENSION vsql_fuzzystrmatch;
```

确认它已存在：

```sql theme={null}
SELECT EXTENSION_NAME
FROM INFORMATION_SCHEMA.EXTENSIONS
WHERE EXTENSION_NAME = 'vsql_fuzzystrmatch';
```

```
+--------------------+
| EXTENSION_NAME     |
+--------------------+
| vsql_fuzzystrmatch |
+--------------------+
```

要自行构建，请按照[存储库](https://github.com/villagesql/vsql-fuzzystrmatch)中的
构建说明进行操作。

## 新增内容

| 函数 | 返回 | 作用 |
| - | - | - |
| `vsql_fuzzystrmatch.soundex(s)` | 文本 | Soundex 码，发音相似的姓名共享同一个值。这个函数需要加限定名，见下面的说明 |
| `difference(a, b)` | 整数 | 四个 Soundex 位置中有多少个匹配，0 到 4 |
| `levenshtein(a, b)` | 整数 | 编辑距离 |
| `levenshtein_cost(a, b, ins, del, sub)` | 整数 | 同上，但每种操作的代价由您指定 |
| `levenshtein_less_equal(a, b, max)` | 整数 | 距离，一旦超过 `max` 就停止并返回 `max` 加 1 |
| `levenshtein_less_equal_cost(a, b, ins, del, sub, max)` | 整数 | 以上两者的结合 |
| `metaphone(s, length)` | 文本 | Metaphone 码，截断到 `length` |
| `dmetaphone(s)` | 文本 | 主 Double Metaphone 码 |
| `dmetaphone_alt(s)` | 文本 | 备用码，没有备用码时回退到主码 |

## 示例

同一个姓名的两种拼写产生同一个 Soundex 码，`difference` 以满分 4 为
匹配打分：

```sql theme={null}
SELECT vsql_fuzzystrmatch.soundex('Robert') AS robert,
       vsql_fuzzystrmatch.soundex('Rupert') AS rupert,
       difference('Robert', 'Rupert') AS same_sound;
```

```
+--------+--------+------------+
| robert | rupert | same_sound |
+--------+--------+------------+
| R163   | R163   |          4 |
+--------+--------+------------+
```

编辑距离则统计改动次数：

```sql theme={null}
SELECT levenshtein('kitten', 'sitting') AS edits,
       levenshtein_less_equal('kitten', 'sitting', 2) AS capped_at_2;
```

```
+-------+-------------+
| edits | capped_at_2 |
+-------+-------------+
|     3 |           3 |
+-------+-------------+
```

Metaphone 处理被拼写掩盖的发音，例如 Thompson 中的 `Th`：

```sql theme={null}
SELECT metaphone('Thompson', 10) AS metaphone, dmetaphone('Thompson') AS dmetaphone;
```

```
+-----------+------------+
| metaphone | dmetaphone |
+-----------+------------+
| 0MPSN     | TMPSN      |
+-----------+------------+
```

> [!WARNING]
>
> MySQL 自带一个 `SOUNDEX()`，当您不加限定名写这个名称时，内置函数
> 优先。两者结果不同：`SOUNDEX('Ashcraft')` 返回 `A2613`，而
> `vsql_fuzzystrmatch.soundex('Ashcraft')` 返回 `A261`。MySQL 的版本在
> 文档中说明返回任意长度的字符串，而扩展的版本遵循四字符的 Soundex
> 定义。请用扩展名限定调用，以得到您想要的那个。这里的其他函数都
> 没有被遮蔽。

> [!NOTE]
>
> `levenshtein_less_equal` 在真实距离超过您给定的上限时立即停止，然后
> 返回上限加 1，无论真实距离是多少。上限为 2 时，相差 3 的一对返回 3，
> 相差 7 的一对也返回 3。请把"上限加 1"理解为"比您询问的范围更远"。

## 另请参阅

* [MySQL 中的模糊字符串匹配](https://villagesql.com/docs/en/guides/fuzzy-string-matching.md) — 在语音编码和编辑距离之间选择
* [三元组相似度](https://villagesql.com/docs/en/guides/trigram-similarity.md) — 对部分匹配排序，而不是给成对的字符串打分
* [安装扩展](https://villagesql.com/docs/zh/extensions/install.md) — `INSTALL EXTENSION` 如何工作，以及服务器在哪里查找包
* [可用扩展](https://villagesql.com/docs/zh/extensions/catalog) — 完整目录
* [villagesql/vsql-fuzzystrmatch](https://github.com/villagesql/vsql-fuzzystrmatch) — 源代码、构建说明和已知限制


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.