Oracle数据库如何计算非ASCII字符的编辑距离与相似度?
Oracle UTL_MATCH 编辑距离函数的非ASCII字符异常行为
在使用Oracle数据库的UTL_MATCH.EDIT_DISTANCE和UTL_MATCH.EDIT_DISTANCE_SIMILARITY函数时(两者对应未归一化和归一化的Levenshtein距离),发现其输出与标准实现存在明显差异,尤其在处理非ASCII特殊字符时表现异常。
标准归一化Levenshtein距离的计算公式为:
1 - edit_distance / len(longer_string)
但Oracle的归一化结果与该公式输出不完全匹配,甚至未归一化的编辑距离值也常不符合预期。
测试结果对比
以下是Oracle的输出(已将归一化值从[0,100]缩放至[0,1])与标准算法预期结果的对比:
| 字符串A | 字符串B | 预期编辑距离 | Oracle编辑距离 | 预期归一化值 | Oracle归一化值 |
|---|---|---|---|---|---|
| stack | stock | 1 | 1 | 1 - 1/5 = 0.8 | 0.8 |
| müll | mall | 1 | 2 | 1 - 3/4 = 0.75 | 0.6 |
| déjà-vu | deja-vu | 1 | 2 | 1 - 1/7 = 0.857 | 0.750 |
| château | château! | 1 | 1 | 1 - 1/8 = 0.875 | 0.89 |
测试SQL语句
用于获取上述结果的SQL语句如下(替换'a'和'b'为对应测试字符串):
SELECT UTL_MATCH.EDIT_DISTANCE('a', 'b') FROM dual; SELECT UTL_MATCH.EDIT_DISTANCE_SIMILARITY('a', 'b') FROM dual;
异常行为分析
若将每个特殊字符视为两个普通字符,Oracle的所有结果看似合理:德语变音符号存在"ae"/"oe"/"ue"这类常见替代形式,但法语特殊字符并无类似通用替代规则。
更奇怪的是,将"Müller"分别与"Mller"、"Muller"、"Mueller"对比时,三者的编辑距离均为2,说明Oracle并未将"ü"简单转换为"ue"处理,这显然不符合预期。
疑问
Oracle对非ASCII字符的这种处理方式是否有先例或科学依据?目前看来更像是随机行为甚至bug。
免责声明:该行为也可能与使用的DBVisualizer(SQL客户端)或Oracle数据库版本有关,受环境安装限制,暂时无法排除该变量影响。
内容的提问来源于stack exchange,提问作者PixelMaster
相关产品推荐
相关产品推荐

