You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django搭配PostgreSQL时非拉丁字符不区分大小写搜索失效问题

问题原因

PostgreSQL 对非 ASCII 字符的大小写不敏感匹配依赖数据库的排序规则(collation)配置,默认的英文排序规则(如 en_US.UTF8)不支持西里尔字母的大小写转换逻辑,因此俄文的 Б 和 б 无法被识别为同一字符的大小写形式,导致 icontains/istartswith 等大小写不敏感查询失效。

可用解决方案

方案1:修改字段排序规则(推荐,长期有效)

Django 3.2 原生支持字段级别的 collation 配置,只需调整模型字段定义即可:

  1. 首先确认 PostgreSQL 已安装对应语言的 locale 包,在终端执行以下命令验证:
locale -a | grep -E 'ru_RU.utf8|kk_KZ.utf8'

如果无返回结果,需先安装对应语言包并生成 locale:

  • Debian/Ubuntu 系统执行 dpkg-reconfigure locales,勾选 ru_RU.UTF8/kk_KZ.UTF8 后确认生成即可
  • MacOS 系统默认已内置多语言 locale,无需额外安装
  1. 修改模型字段定义,添加 collation 参数:
class LatestConfiguration(models.Model):
    name = models.CharField(verbose_name='Имя',
                            max_length=150,
                            unique=True,
                            primary_key=True,
                            # 俄语场景用 ru_RU.UTF8,哈萨克语场景可替换为 kk_KZ.UTF8
                            collation='ru_RU.UTF8')
  1. 生成并执行迁移文件,修改完成后原有 icontains/istartswith 查询即可正常支持西里尔字母的大小写不敏感匹配。

方案2:查询时临时指定排序规则(无需修改表结构)

如果不想改动现有表结构,可以在查询时手动指定 collation 规则:

from django.db.models import F
from django.db.models.functions import Lower

LatestConfiguration.objects.filter(
    # 字段和查询关键词同时转小写并指定俄语排序规则
    Lower(F('name'), collate='ru_RU.UTF8')__contains='бух'
)

方案3:使用 Postgres 全文搜索时指定语言配置

之前开启 Postgres 全文搜索后未生效是因为没有指定对应语言的搜索配置,调整查询写法即可:

from django.contrib.postgres.search import SearchVector, SearchQuery

# 俄语场景指定 config='russian',哈萨克语场景替换为 config='kazakh'
vector = SearchVector('name', config='russian')
query = SearchQuery('бух', config='russian')
LatestConfiguration.objects.annotate(search=vector).filter(search=query)

方案4:使用大小写不敏感字段类型

如果需要全局支持多语言大小写不敏感查询,可以将字段替换为 Postgres 原生的 CIText 类型:

  1. 首先在数据库中开启 citext 扩展:
CREATE EXTENSION IF NOT EXISTS citext;
  1. 修改模型字段类型:
from django.contrib.postgres.fields import CITextField

class LatestConfiguration(models.Model):
    name = CITextField(verbose_name='Имя',
                       max_length=150,
                       unique=True,
                       primary_key=True)
  1. 执行迁移后,所有针对该字段的查询默认都是大小写不敏感的,无需额外指定 collation。
注意事项
  • 修改字段 collation 或类型后,建议重建该字段的索引,避免查询性能下降
  • 生产环境修改表结构前请先备份数据

内容的提问来源于stack exchange,提问作者arpa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 14:09:06