Кодировки базы данных

Проверим, что в ОС есть локали с кодировкой 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)