Oracle utl_match специальные символы - PullRequest
1 голос
/ 27 октября 2008

Я бы хотел использовать функцию Oracle utl_match.edit_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.

Ответы [ 2 ]

2 голосов
/ 27 октября 2008

Похоже, это связано с набором символов. Если я выполню тот же тест в базе данных 10.2.0.3 и 11.1.0.7, используя ISO8859P15 в качестве набора символов, я получу расстояние 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 голос
/ 27 октября 2008

Согласен, похоже, что это неправильно. Однако этот пакет не документирован Oracle, поэтому, возможно, в настоящее время он не поддерживается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...