Giải pháp của người đàn ông đáng thương
Nếu bạn có thể tạo một hàm, bạn có thể sử dụng hàm này. Tôi đã biên soạn danh sách bắt đầu từ tại đây và được thêm vào nó theo thời gian. Nó là khá đầy đủ. Bạn thậm chí có thể muốn xóa một số ký tự:
CREATE OR REPLACE FUNCTION lower_unaccent(text)
RETURNS text AS
$func$
SELECT lower(translate($1
, '¹²³áàâãäåāăąÀÁÂÃÄÅĀĂĄÆćčç©ĆČÇĐÐèéêёëēĕėęěÈÊËЁĒĔĖĘĚ€ğĞıìíîïìĩīĭÌÍÎÏЇÌĨĪĬłŁńňñŃŇÑòóôõöōŏőøÒÓÔÕÖŌŎŐØŒř®ŘšşșߊŞȘùúûüũūŭůÙÚÛÜŨŪŬŮýÿÝŸžżźŽŻŹ'
, '123aaaaaaaaaaaaaaaaaaacccccccddeeeeeeeeeeeeeeeeeeeeggiiiiiiiiiiiiiiiiiillnnnnnnooooooooooooooooooorrrsssssssuuuuuuuuuuuuuuuuyyyyzzzzzz'
));
$func$ LANGUAGE sql IMMUTABLE;
Truy vấn của bạn sẽ hoạt động như vậy:
find(:all, :conditions => ["lower_unaccent(name) LIKE ?", "%#{search.downcase}%"])
Đối với các tìm kiếm được neo bên trái, bạn có thể sử dụng một chỉ mục trên hàm cho rất kết quả nhanh chóng:
CREATE INDEX tbl_name_lower_unaccent_idx
ON fest (lower_unaccent(name) text_pattern_ops);
Đối với các truy vấn như:
SELECT * FROM tbl WHERE (lower_unaccent(name)) ~~ 'bob%'
Giải pháp thích hợp
Trong PostgreSQL 9.1+ , với các đặc quyền cần thiết, bạn chỉ có thể:
CREATE EXTENSION unaccent;
cung cấp một hàm unaccent()
, làm những gì bạn cần (ngoại trừ lower()
, chỉ cần sử dụng bổ sung nếu cần). Đọc hướng dẫn về tiện ích này
.
Cũng có sẵn cho PostgreSQL 9.0 nhưng CREATE EXTENSION
cú pháp mới trong 9.1.
Thông tin thêm về các chỉ mục và không thẳng thắn: