Проверим, что в ОС есть локали с кодировкой koi8:
=> \! locale -a|grep koi8
ru_RU.koi8r
Создаем базы данных с кодировками KOI8R и UTF8:
=> CREATE DATABASE admin_localization_koi8r TEMPLATE template0 ENCODING 'KOI8R' LC_CTYPE 'ru_RU.koi8r' LC_COLLATE 'ru_RU.koi8r';
CREATE DATABASE
=> CREATE DATABASE admin_localization_utf8;
CREATE DATABASE
=> \l admin_localization_*
List of databases Name | Owner | Encoding | Collate | Ctype | Access privileges --------------------------+----------+----------+-------------+-------------+------------------- admin_localization_koi8r | postgres | KOI8R | ru_RU.koi8r | ru_RU.koi8r | admin_localization_utf8 | postgres | UTF8 | ru_RU.utf8 | ru_RU.utf8 | (2 rows)
Подключаемся к базе с кодировкой KOI8R:
=> \c admin_localization_koi8r
You are now connected to database "admin_localization_koi8r" as user "postgres".
=> SET client_encoding = 'UTF8';
SET
Убедимся, что клиент и сервер используют разные кодировки:
=> SELECT name, setting FROM pg_settings WHERE name LIKE '%encoding';
name | setting -----------------+--------- client_encoding | UTF8 server_encoding | KOI8R (2 rows)
Создаем таблицу, содержащую строки с кириллицей:
=> CREATE TABLE tab AS SELECT 'Привет, мир!' AS col;
SELECT 1
=> SELECT * FROM tab;
col -------------- Привет, мир! (1 row)
=> \q
Получаем логическую копию:
student$ pg_dump -d admin_localization_koi8r -Fc -f koi8r.dump
Содержимое копии выгружается в кодировке базы данных (KOI8R), а в начале файла есть команда установки параметра client_encoding в то же значение KOI8R.
Восстанавливаем таблицу в базе данных admin_localization_utf8:
student$ pg_restore koi8r.dump -d admin_localization_utf8 -t tab
Благодаря установке client_encoding при восстановлении символы автоматически перекодируются. Проверим, что кириллица корректно перенесена:
student$ psql -d admin_localization_utf8
=> SELECT * FROM tab;
col -------------- Привет, мир! (1 row)
Текущие настройки локализации даты и времени:
=> SHOW lc_time;
lc_time ------------ ru_RU.utf8 (1 row)
Для получения номера дня недели есть две форматные маски:
=> SELECT to_char(current_date, 'TMDay: ID') AS "ID", to_char(current_date, 'TMDay: D') AS "D" ;
ID | D ----------------+---------------- Понедельник: 1 | Понедельник: 2 (1 row)
Номер дня недели не зависит от настроек локализации, в частности, от параметра lc_time:
=> SET lc_time TO 'en_US.utf8';
SET
=> SELECT to_char(current_date, 'TMDay: ID') AS "ID", to_char(current_date, 'TMDay: D') AS "D" ;
ID | D -----------+----------- Monday: 1 | Monday: 2 (1 row)