У процесі налаштування сервера для сайту довелося зіткнутися з деякими проблемами. Зокрема, з проблемою кодування бази даних PostgreSQL. Справа в тому, що при установці PostgreSQL шаблони баз даних створювалися з кодуванням LATIN1, а сайт працює на Django, з використанням кодування UTF8. В результаті при спробі вставки даних випадала наступна помилка:
ERROR: encoding UTF8 does not match locale en_US Detail: The chosen LC_CTYPE setting requires encoding LATIN1.
Пошукавши інформацію, вдалося знайти кілька рішень, серед яких було рішення, яке дозволяє перестворити шаблон бази даних із кодуванням UTF8. Але пройдемося уважно за симптомами завдання.
Перевірка кодування
Для перевірки кодування, що використовується на сервері та базі даних, необхідно виконати наступні команди.
Заходимо в режим роботи з PoctgreSQL:
sudo -u postgres psql
psql – це утиліта для роботи з базами даних, а postgres – це супер користувач PostgreSQL.
І виконуємо такі команди:
postgres=# SHOW SERVER_ENCODING; server_encoding ----------------- LATIN1 (1 row) postgres=# \l List of databases Name | Owner | Encoding | Collate | Ctype | Access privileges -----------+----------+----------+---------+-------+----------------------- postgres | postgres | LATIN1 | en_US | en_US | template0 | postgres | LATIN1 | en_US | en_US | =c/postgres + | | | | | postgres=CTc/postgres template1 | postgres | LATIN1 | en_US | en_US | =c/postgres + | | | | | postgres=CTc/postgres (3 rows)
У виводі буде показано кодування LATIN1 як для сервера, так і для баз даних.
Виправлення кодування для template1
Тепер виправимо кодування template1, який використовується для створення баз даних.
postgres=# UPDATE pg_database SET datistemplate = FALSE WHERE datname = 'template1'; postgres=# DROP DATABASE Template1; postgres=# CREATE DATABASE template1 WITH owner=postgres ENCODING = 'UTF-8' lc_collate = 'en_US.utf8' lc_ctype = 'en_US.utf8' template template0; postgres=# UPDATE pg_database SET datistemplate = TRUE WHERE datname = 'template1';
У цьому випадку ми спочатку вказуємо, що template1 не є шаблоном для баз даних. Видаляємо цей шаблон. Потім створюємо новий шаблон з кодуванням UTF8 і встановлюємо цю базу даних як шаблон для нових баз даних. Далі нові бази даних створюватимуться з кодуванням UTF8.
І перевіримо, в якому кодуванні у нас знаходиться шаблон template1, сам сервер, до речі, буде, як і раніше, в кодуванні LATIN1
postgres=# \l List of databases Name | Owner | Encoding | Collate | Ctype | Access privileges -----------+----------+----------+------------+------------+----------------------- postgres | postgres | LATIN1 | en_US | en_US | template0 | postgres | LATIN1 | en_US | en_US | =c/postgres + | | | | | postgres=CTc/postgres template1 | postgres | UTF8 | en_US.utf8 | en_US.utf8 | (3 rows)