web-dev-qa-db-ja.com

PostgreSQLのUTF8_UNICODE_CI照合に相当

PostgreSQLデータベース内のテーブルの列を希望します(バージョン9.6を使用しています)。 MySQLのUTF8_UNICODE_CI照合を知っているので、試してみました。

CREATE TABLE thing (
    id    BIGINT PRIMARY KEY
   ,name  VARCHAR(120) NOT NULL COLLATE "UTF8_UNICODE_CI"
);

しかし私は得る:

ERROR: collation "UTF8_UNICODE_CI" for encoding "UTF8" does not exist

周りを読んでいると、pg_collationテーブルに照合順序が表示されていることがわかりました。

=# SELECT * from pg_collation;
 collname | collnamespace | collowner | collencoding | collcollate | collctype
----------+---------------+-----------+--------------+-------------+-----------
 default  |            11 |        10 |           -1 |             |
 C        |            11 |        10 |           -1 | C           | C
 POSIX    |            11 |        10 |           -1 | POSIX       | POSIX
(3 rows)

だからそれは明らかにそこにありません...それを追加したり、私が望む振る舞いを得る方法はありますか? (WHERE name LIKE '%lala%'を検索して'lalá''LÂLÄ'などに一致させたい。)

4
Daniel Gray

Postgresでは、通常、これを異なる方法で解決します。

はじめに、大文字と小文字を区別しない一致のためにILIKEを使用するだけです。 マニュアル:

キーILIKELIKEの代わりに使用して、アクティブなロケールに応じて大文字と小文字を区別せずに一致させることができます。これはSQL標準にはありませんが、PostgreSQLの拡張機能です。

_WHERE name ILIKE '%lala%'
_

このために別の照合は必要ありません。トライグラムインデックスは、大文字と小文字を区別するパターンマッチングと区別しないパターンマッチングの両方をサポートします。

または、より移植性の高いlower(col) LIKEを使用します

_WHERE lower(name) LIKE '%lala%'  -- pattern must be lower case, too.
_

または、追加モジュール citext によって提供される特別なデータ型citextを使用することもできます。

特別な照合を要求する場合は、独自の照合を作成できます。

しない.

文字列の「正規化」を一歩進めたい場合(すべての発音区別符号を削除する場合)は、unaccent()を参照してください。

リンクされた回答では、両方の手順を組み合わせることができます。詳細はこちら:

概要:


私はILIKEを使用して、大きなテーブルのトライグラムインデックスでそれをサポートします。できれば最新バージョンのPostgres 9.6を使用してください。トライグラムGINインデックスのいくつかの改善があります。

3