首页 >数据库 >mysql教程 >PostgreSQL 是否提供不区分重音的排序规则以实现高效的字符串匹配?

PostgreSQL 是否提供不区分重音的排序规则以实现高效的字符串匹配?

Patricia Arquette
Patricia Arquette原创
2025-01-20 12:36:12455浏览

Does PostgreSQL Offer Accent-Insensitive Collations for Efficient String Matching?

PostgreSQL 的“重音不敏感”排序规则支持

PostgreSQL 是否支持“重音不敏感”排序规则?

Microsoft SQL Server 提供“重音不敏感”排序规则,允许执行诸如 SELECT * FROM users WHERE name LIKE 'João' 之类的查询来查找包含“Joao”名称的行。PostgreSQL 本身并不支持此类排序规则。

使用 unaccent 模块的解决方案

PostgreSQL 提供 unaccent 模块,该模块可从字符串中删除变音符号。要使用它,请安装扩展程序(CREATE EXTENSION unaccent)。然后,您可以执行如下所示的不区分大小写的搜索:

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

表达式索引

为了提高查询速度,请使用 f_unaccent 函数创建表达式索引。这允许规划器利用索引来处理涉及 unaccenting 的查询。

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

PostgreSQL 12 及其 ICU 排序规则

较新的 PostgreSQL 版本(12 )支持 ICU(Unicode 国际组件)排序规则,这些排序规则提供重音不敏感的分组和排序。但是,这些排序规则可能会影响性能。如果您优先考虑性能,请考虑使用 unaccent 解决方案。

<code class="language-sql">CREATE COLLATION ignore_accent (provider = icu, locale = 'und-u-ks-level1-kc-true', deterministic = false);
CREATE INDEX users_name_ignore_accent_idx ON users(name COLLATE ignore_accent);
SELECT * FROM users WHERE name = 'João' COLLATE ignore_accent;</code>

以上是PostgreSQL 是否提供不区分重音的排序规则以实现高效的字符串匹配?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn