Rumah >pangkalan data >tutorial mysql >Bagaimanakah Saya Boleh Mencapai Carian Tidak Sensitif Aksen dalam PostgreSQL?

Bagaimanakah Saya Boleh Mencapai Carian Tidak Sensitif Aksen dalam PostgreSQL?

Linda Hamilton
Linda Hamiltonasal
2025-01-20 12:21:17455semak imbas

How Can I Achieve Accent-Insensitive Searches in PostgreSQL?

Pendekatan PostgreSQL untuk Carian Tidak Sensitif Aksen

Tidak seperti sesetengah pangkalan data (seperti Microsoft SQL Server), PostgreSQL tidak menyokong himpunan tidak sensitif aksen secara asli. Walaupun PostgreSQL 12 memperkenalkan himpunan ICU bukan deterministik yang menawarkan ketidakpekaan kes dan aksen, ini disertakan dengan pertukaran prestasi dan sekatan operasi.

Strategi untuk Pertanyaan Tidak Sensitif Aksen dalam PostgreSQL

Beberapa kaedah wujud untuk mencapai carian tidak sensitif aksen dalam PostgreSQL:

1. Modul unaccent:

Modul ini menyediakan fungsi unaccent(), mengalih keluar aksen daripada rentetan. Ini membenarkan pertanyaan seperti:

<code class="language-sql">SELECT * FROM users WHERE unaccent(name) = unaccent('João');</code>

Walau bagaimanapun, unaccent() tidak BOLEH UBAH, menghalang penggunaannya dalam indeks ungkapan dan ia tidak mengembangkan ligatur (cth., 'Œ').

2. Pembalut Fungsi C Dioptimumkan:

Untuk menangani batasan unaccent(), penyelesaian yang lebih cekap melibatkan mencipta pembungkus fungsi C TIDAK BOLEH:

<code class="language-sql">CREATE OR REPLACE FUNCTION public.f_unaccent(text)
  RETURNS text
  LANGUAGE sql IMMUTABLE PARALLEL SAFE STRICT
RETURN public.immutable_unaccent(regdictionary 'public.unaccent', );</code>

Ini membolehkan penciptaan indeks ekspresi:

<code class="language-sql">CREATE INDEX users_unaccent_name_idx ON users(public.f_unaccent(name));</code>

Pertanyaan kemudian gunakan fungsi yang dibalut:

<code class="language-sql">SELECT * FROM users WHERE f_unaccent(name) = f_unaccent('João');</code>

3. Memanfaatkan pg_trgm untuk Padanan Corak dan Pengikat:

Untuk padanan corak dan pengendalian ligatur yang lebih fleksibel, modul pg_trgm dengan indeks trigram menawarkan penyelesaian yang berkuasa. Indeks GIN trigram membolehkan carian tidak sensitif huruf besar dan pengesanan persamaan:

<code class="language-sql">CREATE INDEX users_unaccent_name_trgm_idx ON users
USING gin (f_unaccent(name) gin_trgm_ops);

SELECT * FROM users WHERE f_unaccent(name) LIKE ('%' || f_unaccent('João') || '%');</code>

Perhatikan bahawa pg_trgm indeks lebih intensif sumber berbanding indeks B-tree standard.

Memilih pendekatan optimum bergantung pada keperluan khusus aplikasi anda, mengimbangi prestasi pertanyaan dengan kos penyelenggaraan indeks dan keperluan untuk pengendalian ligatur.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mencapai Carian Tidak Sensitif Aksen dalam PostgreSQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn