В процессе настройки сервера для сайта, пришлось столкнуться с некоторыми проблемами. В частности с проблемой кодировки базы данных 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)