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

45 lines
3.2 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# PostgreSQL 16.11: поиск в Mail и локаль БД
Краткая справка по влиянию локали и настройкам PostgreSQL 16.x на поиск писем в приложении Mail.
## Роль локали (не параметр `lang`)
- **`lang`** в F7cloud — язык интерфейса; на работу поиска в БД не влияет.
- На поиск по тексту (отправитель, получатель, тема) влияет **локаль базы PostgreSQL**:
- **`datcollate`** / **`datctype`** (или на уровне кластера: **`lc_collate`**, **`lc_ctype`**).
- Проверка текущей локали и кодировки (только чтение):
```sql
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)
- [24.1. Locale Support](https://www.postgresql.org/docs/16/locale.html)
- [24.2. Collation Support](https://www.postgresql.org/docs/16/collation.html)
- [F.10. citext — case-insensitive character string type](https://www.postgresql.org/docs/16/citext.html)