Oracle utl_匹配特殊字符

Oracle utl_匹配特殊字符,oracle,Oracle,我想使用Oracle的utl_match.edit_distance函数。它应该比较两个字符串并返回结果 按预期返回1,但 select utl_match.edit_distance('á','b') from dual 返回2。显然我想要1 这似乎是,它不能正确地工作为特殊字符。我使用的是Oracle 10.2.0.4和AL32UTF8字符集。我同意,它似乎是错误的。但是,Oracle未记录此软件包,因此目前可能不支持此软件包。这似乎与字符集有关。如果我使用ISO8859P15作为字符集在

我想使用Oracle的utl_match.edit_distance函数。它应该比较两个字符串并返回结果

按预期返回1,但

select utl_match.edit_distance('á','b') from dual
返回2。显然我想要1


这似乎是,它不能正确地工作为特殊字符。我使用的是Oracle 10.2.0.4和AL32UTF8字符集。

我同意,它似乎是错误的。但是,Oracle未记录此软件包,因此目前可能不支持此软件包。

这似乎与字符集有关。如果我使用ISO8859P15作为字符集在10.2.0.3和11.1.0.7数据库中运行相同的测试,则距离也为1。我猜Oracle是以字节而不是可变宽度字符集中的字符来计算距离的

您可以使用CONVERT函数解决此问题,将其转换为固定宽度字符集(AL16UTF16或本地字符集)


谢谢你的解决办法。非常奇怪,但将'a'与'bb'进行比较,在AL32UTF8中得到2,在WE8ISO8859P15中得到2,但在AL16UTF16中得到3。
select utl_match.edit_distance('á','b') from dual
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.