2008-10-27 9 views
1

오라클의 utl_match.edit_distance 기능을 사용하고 싶습니다. 두 문자열을 비교하여 Levenshtein distance을 반환합니다. 예상대로오라클의 utl_match 특수 문자

select utl_match.edit_distance('a','b') from dual 

반환 1 만

select utl_match.edit_distance('á','b') from dual 

반환 분명히 나는 ​​1.이 될 것으로 보인다

, 그것은 특수 문자를 제대로 작동하지 않습니다 좀하고 싶습니다 2. Oracle 10.2.0.4 및 AL32UTF8 문자 집합을 사용하고 있습니다.

답변

2

이것은 문자 세트와 관련이있는 것으로 보입니다. ISO8859P15를 문자 집합으로 사용하는 10.2.0.3 및 11.1.0.7 데이터베이스에서 동일한 테스트를 실행하면 거리도 1만큼 늘어납니다. 필자는 오라클이 가변 폭 문자 세트의 문자가 아닌 바이트면에서 거리를 계산한다고 추측합니다.

당신은 고정 폭 문자 세트 (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. 
+0

감사로 변환 CONVERT 함수를 사용하여 문제를 해결할 수 있습니다. 꽤 이상하지만 'a'와 'bb'를 비교하면 AL32UTF8에서는 2, WE8ISO8859P15에서는 2, AL16UTF16에서는 3이됩니다. – asalamon74

1

동의합니다. 잘못되었습니다. 그러나이 패키지는 Oracle에서 문서화되어 있지 않으므로 현재 지원되지 않을 수 있습니다.