Ошибка PostgreSQL 42P12: invalid_database_definition — создание баз
- Ошибка
ERROR: invalid database definition: ... (SQLSTATE 42P12)при попытке создания базы данных. - Несовместимость выбранной кодировки (ENCODING) и правил сортировки (LC_COLLATE / LC_CTYPE).
- Отказ создания информационной базы 1С через консоль администрирования кластера серверов.
1. Проверка системных локалей операционной системы
Убедитесь, что требуемая локаль установлена и сгенерирована в Linux:
locale -a | grep -Ei "ru_RU|en_US"
# Если локаль отсутствует, сгенерируйте ее (Ubuntu/Debian):
sudo locale-gen ru_RU.UTF-8
sudo update-locale
# Для RHEL/Rocky Linux:
sudo dnf install -y glibc-langpack-ru2. Корректное создание базы данных для 1С:Предприятие
Создавайте базу с явным совпадением кодировки UTF-8 и локали:
CREATE DATABASE ib_trade_db
WITH
OWNER = usr1cv8
ENCODING = 'UTF8'
LC_COLLATE = 'ru_RU.UTF-8'
LC_CTYPE = 'ru_RU.UTF-8'
TEMPLATE = template0
CONNECTION LIMIT = -1;3. Исправление несовместимости кодировок шаблона template1
Если шаблонная база `template1` была создана в `SQL_ASCII` или `LATIN1`, создание баз с `UTF-8` вызовет ошибку. Используйте `TEMPLATE = template0` (чистый системный шаблон).
Частые вопросы (FAQ)
Почему 1С требует обязательного использования локали ru_RU.UTF-8?
Платформа 1С полагается на корректное лексикографическое упорядочивание кириллических строк, регистронезависимое сравнение и правильную работу полнотекстового поиска.
Можно ли изменить кодировку существующей базы данных?
Нет. Кодировка (ENCODING) и правила сортировки (COLLATE) задаются при создании. Для изменения требуется создать новую базу и выполнить выгрузку/загрузку через pg_dump / pg_restore или DT-файл 1С.
Что делать, если возникает ошибка: template database is being accessed by other users?
Завершите все активные подключения к шаблону: SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname = 'template1';
Какую стратегию локализации выбрать в PostgreSQL 16+: libc или icu?
Для современных баз 1С рекомендуется использовать провайдер ICU (LOCALE_PROVIDER = 'icu'), так как он гарантирует независимость правил сортировки от обновлений glibc в операционной системе.