我想使用Oracle的utl_match.edit_distance函数。它应该比较两个字符串并返回Levenshtein distance。
select utl_match.edit_distance('a','b') from dual
按预期返回1,但
select utl_match.edit_distance('á','b') from dual
返回2.显然我想得到1。
似乎是,它对特殊字符无法正常工作。我正在使用Oracle 10.2.0.4和AL32UTF8字符集。
答案 0 :(得分:2)
这似乎与字符集有关。如果我使用ISO8859P15作为字符集在10.2.0.3和11.1.0.7数据库中运行相同的测试,我也会得到1的距离。我猜测Oracle正在以字节而不是可变宽度字符集中的字符来计算距离。
使用CONVERT函数转换为固定宽度字符集(AL16UTF16或本地字符集)可以解决此问题
SQL> ed
Wrote file afiedt.buf
1 declare
2 l_char1 varchar2(1 char) := 'á';
3 l_char2 varchar2(1 char) := 'b';
4 begin
5 dbms_output.put_line(
6 'In AL32UTF8: ' ||
7 utl_match.edit_distance( l_char1, l_char2 ) );
8 dbms_output.put_line(
9 'In WE8ISO8859P15: ' ||
10 utl_match.edit_distance(
11 CONVERT( l_char1, 'WE8ISO8859P15', 'AL32UTF8' ),
12 CONVERT( l_char2, 'WE8ISO8859P15', 'AL32UTF8' ) ) );
13 dbms_output.put_line(
14 'In AL16UTF16: ' ||
15 utl_match.edit_distance(
16 CONVERT( l_char1, 'AL16UTF16', 'AL32UTF8' ),
17 CONVERT( l_char2, 'AL16UTF16', 'AL32UTF8' ) ) );
18* end;
SQL> /
In AL32UTF8: 2
In WE8ISO8859P15: 1
In AL16UTF16: 1
PL/SQL procedure successfully completed.
答案 1 :(得分:1)
我同意,这似乎是错误的。但是,Oracle没有记录此软件包,因此目前可能不支持。