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中文网其他相关文章!