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Ä'
などに一致させたい。)
Postgresでは、通常、これを異なる方法で解決します。
はじめに、大文字と小文字を区別しない一致のためにILIKE
を使用するだけです。 マニュアル:
キー
ILIKE
をLIKE
の代わりに使用して、アクティブなロケールに応じて大文字と小文字を区別せずに一致させることができます。これは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インデックスのいくつかの改善があります。