Solusi orang miskin
Jika Anda dapat membuat fungsi, Anda dapat menggunakan yang ini. Saya menyusun daftarnya mulai di sini dan ditambahkan ke dalamnya dari waktu ke waktu. Ini cukup lengkap. Anda bahkan mungkin ingin menghapus beberapa karakter:
CREATE OR REPLACE FUNCTION lower_unaccent(text)
RETURNS text AS
$func$
SELECT lower(translate($1
, '¹²³áàâãäåāăąÀÁÂÃÄÅĀĂĄÆćčç©ĆČÇĐÐèéêёëēĕėęěÈÊËЁĒĔĖĘĚ€ğĞıìíîïìĩīĭÌÍÎÏЇÌĨĪĬłŁńňñŃŇÑòóôõöōŏőøÒÓÔÕÖŌŎŐØŒř®ŘšşșߊŞȘùúûüũūŭůÙÚÛÜŨŪŬŮýÿÝŸžżźŽŻŹ'
, '123aaaaaaaaaaaaaaaaaaacccccccddeeeeeeeeeeeeeeeeeeeeggiiiiiiiiiiiiiiiiiillnnnnnnooooooooooooooooooorrrsssssssuuuuuuuuuuuuuuuuyyyyzzzzzz'
));
$func$ LANGUAGE sql IMMUTABLE;
Permintaan Anda akan berfungsi seperti itu:
find(:all, :conditions => ["lower_unaccent(name) LIKE ?", "%#{search.downcase}%"])
Untuk penelusuran berlabuh kiri, Anda dapat menggunakan indeks pada fungsi untuk sangat hasil cepat:
CREATE INDEX tbl_name_lower_unaccent_idx
ON fest (lower_unaccent(name) text_pattern_ops);
Untuk pertanyaan seperti:
SELECT * FROM tbl WHERE (lower_unaccent(name)) ~~ 'bob%'
Solusi yang tepat
Di PostgreSQL 9.1+ , dengan hak istimewa yang diperlukan, Anda dapat:
CREATE EXTENSION unaccent;
yang menyediakan fungsi unaccent()
, melakukan apa yang Anda butuhkan (kecuali untuk lower()
, gunakan saja tambahan itu jika diperlukan). Baca manual tentang ekstensi ini
.
Juga tersedia untuk PostgreSQL 9.0 tapi CREATE EXTENSION
sintaks baru di 9.1.
Selengkapnya tentang tanpa aksen dan indeks: