45 lines
3.2 KiB
Markdown
45 lines
3.2 KiB
Markdown
# 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)
|