Evgenii Legotckoi
16 сентября 2016 г. 11:38

Исправление кодировки базы данных PostgreSQL с LATIN1 на UTF8

В процессе настройки сервера для сайта, пришлось столкнуться с некоторыми проблемами. В частности с проблемой кодировки базы данных PostgreSQL. Дело в том, что при установке PostgreSQL, шаблоны баз данных создавались с кодировкой LATIN1, а сайт работает на Django, с использованием кодировки UTF8. В результате, при попытке вставки данных выпадала следующая ошибка:

  1. ERROR: encoding UTF8 does not match locale en_US Detail: The chosen LC_CTYPE setting requires encoding LATIN1.

Поискав информацию, удалось найти несколько решений, среди которых было решение, которое позволяет пересоздать шаблон базы данных с кодировкой UTF8. Но пройдёмся внимательно по симптомам задачи.


Проверка кодировки

Для проверки кодировки, применяемой на сервере и в базе данных, необходимо выполнить следующие команды.

Заходим в режим работы с PoctgreSQL:

  1. sudo -u postgres psql

psql - это утилита для работы с базами данных, а postgres - это супер пользователь PostgreSQL.

И выполняем следующие команды:

  1. postgres=# SHOW SERVER_ENCODING;
  2. server_encoding
  3. -----------------
  4. LATIN1
  5. (1 row)
  6.  
  7. postgres=# \l
  8. List of databases
  9. Name | Owner | Encoding | Collate | Ctype | Access privileges
  10. -----------+----------+----------+---------+-------+-----------------------
  11. postgres | postgres | LATIN1 | en_US | en_US |
  12. template0 | postgres | LATIN1 | en_US | en_US | =c/postgres +
  13. | | | | | postgres=CTc/postgres
  14. template1 | postgres | LATIN1 | en_US | en_US | =c/postgres +
  15. | | | | | postgres=CTc/postgres
  16. (3 rows)
  17.  

В выводе будет показана кодировка LATIN1, как для сервера, так и для баз данных.

Исправление кодировки для template1

А теперь исправим кодировку template1, который используется для создания баз данных.

  1. postgres=# UPDATE pg_database SET datistemplate = FALSE WHERE datname = 'template1';
  2. postgres=# DROP DATABASE Template1;
  3. postgres=# CREATE DATABASE template1 WITH owner=postgres ENCODING = 'UTF-8' lc_collate = 'en_US.utf8' lc_ctype = 'en_US.utf8' template template0;
  4. postgres=# UPDATE pg_database SET datistemplate = TRUE WHERE datname = 'template1';

В данном случае сначала мы указываем, что template1 не является шаблоном для баз данных. Удаляем данный шаблон. Потом создаём новый шаблон с кодировкой UTF8 и устанавливаем данную базу данных в качестве шаблона для новых баз данных. Дальше новые базы данных будут создаваться с кодировкой UTF8.

И проверим, в какой кодировке у нас находиться шаблон template1, сам сервер, кстати, будет по-прежнему в кодировке LATIN1

  1. postgres=# \l
  2. List of databases
  3. Name | Owner | Encoding | Collate | Ctype | Access privileges
  4. -----------+----------+----------+------------+------------+-----------------------
  5. postgres | postgres | LATIN1 | en_US | en_US |
  6. template0 | postgres | LATIN1 | en_US | en_US | =c/postgres +
  7. | | | | | postgres=CTc/postgres
  8. template1 | postgres | UTF8 | en_US.utf8 | en_US.utf8 |
  9. (3 rows)

Вам это нравится? Поделитесь в социальных сетях!

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь