在 Microsoft SQL Server 中,可以指定“不区分重音”排序规则(用于数据库、表或列),这意味着可以进行类似的查询
SELECT * FROM users WHERE name LIKE 'João'
查找具有 Joao
名称的行。
我知道可以使用 unaccent_string contrib 函数从 PostgreSQL 中的字符串中去除重音符号,但我想知道 PostgreSQL 是否支持这些“重音不敏感”排序规则,所以上面的 SELECT
可以工作。
原文由 Daniel Serodio 发布,翻译遵循 CC BY-SA 4.0 许可协议
Postgres 12 或更高版本的更新
Postgres 12 添加了 不确定的 ICU 排序规则,支持不区分大小写和不区分重音的分组和排序。 手册:
如果是这样,这对你有用:
小提琴
阅读手册了解详情。 Laurenz Albe 的这篇博文 可能有助于理解。
但ICU排序规则也有 缺点。 手册:
我的“遗留”解决方案可能仍然更好:
对于所有版本
为此使用 unaccent 模块- 这与您链接的内容完全不同。
每个数据库安装一次:
如果您收到如下错误:
CREATE OR REPLACE FUNCTION public.immutable_unaccent(regdictionary, text) RETURNS text LANGUAGE c IMMUTABLE PARALLEL SAFE STRICT AS ‘$libdir/unaccent’, ‘unaccent_dict’;
CREATE OR REPLACE FUNCTION public.f_unaccent(text) RETURNS text LANGUAGE sql IMMUTABLE PARALLEL SAFE STRICT AS \(func\) SELECT public.immutable_unaccent(regdictionary ‘public.unaccent’, \(1) \)func$;
CREATE OR REPLACE FUNCTION public.f_unaccent(text) RETURNS text LANGUAGE sql IMMUTABLE PARALLEL SAFE STRICT AS \(func\) SELECT public.unaccent(‘public.unaccent’, \(1) -- schema-qualify function and dictionary \)func$;
CREATE INDEX users_unaccent_name_idx ON users(public.f_unaccent(name));
SELECT * FROM users WHERE f_unaccent(name) = f_unaccent(‘João’);
SELECT unaccent(‘Œ Æ œ æ ß’);
unaccent
E A e a S
SELECT unaccent(‘Œ Æ œ æ ß’);
unaccent
OE AE oe ae ss
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’) || ‘%’);
”`
GIN 和 GIST 索引比普通 B-tree 更昂贵(维护):
对于左锚模式有更简单的解决方案。有关模式匹配和性能的更多信息:
pg_trgm
还 为“相似性”(%
)和“距离”(<->
)提供了有用的运算符。Trigram 索引还支持带有
~
等的简单正则表达式。和 不区分大小写 的模式匹配ILIKE
: