分音記号付きの「a」は文字シーケンス、つまり aの組み合わせです。 結合文字、発音区別符号:E'a\u0328'
同等の合成済み文字ąがあります :E'\u0105'
解決策は、正規化 することです。 Unicode文字列。つまり、結合文字シーケンスを比較する前に合成済み文字に変換します。
残念ながら、PostgresにはUnicode正規化関数が組み込まれていないようですが、 PL / Perl
または
例:
create extension plpythonu;
create or replace function unicode_normalize(str text) returns text as $$
import unicodedata
return unicodedata.normalize('NFC', str.decode('UTF-8'))
$$ language plpythonu;
さて、文字シーケンスとしてE'a\u0328'
同等の合成済み文字E'\u0105'
にマップされます unicode_normalize
を使用する 、レーベンシュタイン距離は正しいです:
select levenshtein(unicode_normalize(E'a\u0328'), 'x');
levenshtein
-------------
1