sql >> データベース >  >> RDS >> PostgreSQL

マルチバイト対応のPostgresqlLevenshteinはありますか?

    分音記号付きの「a」は文字シーケンス、つまり aの組み合わせです。 結合文字、発音区別符号:E'a\u0328'

    同等の合成済み文字ąがあります :E'\u0105'

    解決策は、正規化 することです。 Unicode文字列。つまり、結合文字シーケンスを比較する前に合成済み文字に変換します。

    残念ながら、PostgresにはUnicode正規化関数が組み込まれていないようですが、 PL / Perl または PL / Python 言語拡張。

    例:

    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
    



    1. Vertx JDBCクライアントqueryWithParams-リストを追加する方法は?

    2. enwiki-latest-categorylinks.sqlをmysqlにロードする

    3. PostgreSQL-pgAdminで関数テキスト/ソースを表示するにはどうすればよいですか?

    4. Postgres INSERT ON CONFLICT DO UPDATEvsINSERTまたはUPDATE