2008-10-27 99 views
1

我想使用Oracle的utl_match.edit_distance函數。它應該比較兩個字符串並返回Levenshtein distanceOracle utl_match特殊字符

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字符集。

回答

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. 
+0

謝謝你的解決方法解決該問題。很奇怪,但是比較'a'和'bb'在AL32UTF8中給出2,在WE8ISO8859P15中給出2,而在AL16UTF16中給出3。 – asalamon74 2008-10-28 09:45:07

1

我同意,這似乎是錯誤的。但是,這個軟件包沒有Oracle的文檔,所以目前可能還不支持。