f7cloud_client/apps/mail/doc/postgresql-16-search-locale.md
root 8b6a0139db f7cloud_client
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-17 22:59:26 +00:00

3.2 KiB
Raw Permalink Blame History

PostgreSQL 16.11: поиск в Mail и локаль БД

Краткая справка по влиянию локали и настройкам PostgreSQL 16.x на поиск писем в приложении Mail.

Роль локали (не параметр lang)

  • lang в F7cloud — язык интерфейса; на работу поиска в БД не влияет.
  • На поиск по тексту (отправитель, получатель, тема) влияет локаль базы PostgreSQL:
    • datcollate / datctype (или на уровне кластера: lc_collate, lc_ctype).
  • Проверка текущей локали и кодировки (только чтение):
    SELECT datname, datcollate, datctype, pg_encoding_to_char(encoding) AS encoding
    FROM pg_database WHERE datname = current_database();
    

Поведение при локали C / POSIX (типично для «по умолчанию»)

Что проверяли Результат
LOWER('Дмитрий') Строка не меняется (кириллица не приводится к нижнему регистру).
'Дмитрий Мельник' ILIKE '%дми%' false (регистр для кириллицы не игнорируется).
'Дмитрий Мельник' LIKE '%Дми%' true.

Поэтому в Mail для поиска по отправителю/получателю/теме при «голом» запросе (например, «Дми») в запрос подставляются оба варианта: как введено и в нижнем регистре — поиск не зависит от локали БД.

Рекомендации для PostgreSQL 16.11

  1. Оставить как есть
    С текущей реализацией Mail поиск по кириллице работает и при datctype = C.

  2. Если нужна «нативная» поддержка регистронезависимого поиска в БД
    Создавать базу с локалью, поддерживающей нужный язык, например:

    • ru_RU.UTF-8 — для кириллицы;
    • en_US.UTF-8 — для латиницы.
      Локаль задаётся при создании кластера (initdb -D ... --locale=ru_RU.UTF-8) или при создании БД (CREATE DATABASE ... LC_COLLATE='ru_RU.UTF-8' LC_CTYPE='ru_RU.UTF-8'). Сменить локаль у уже существующей БД без дампа/восстановления нельзя.
  3. Кодировка
    Для Mail важно использовать UTF-8 (encoding = UTF8). В PostgreSQL 16.11 по умолчанию так и есть при создании БД из шаблона с UTF-8.

Полезные ссылки (PostgreSQL 16)