Сортировка на уровне базы данных Postgresql, уровень таблицы, уровень столбца - PullRequest
0 голосов
/ 08 июля 2019

У меня есть база данных, созданная с типом сортировки 'C' с набором символов UTF8.Если я создам какую-либо таблицу или индекс в той же базе данных, будет ли она иметь сопоставление 'C', или мне нужно будет явно определить время создания таблицы или индекса.

Как мы можем извлечь детали сортировки для таблиц и индексов в postgresql 11

Создание базы данных с сортировкой 'C' также создает таблицы и идексы без явного типа сортировки.

CREATE DATABASE testdb
    WITH 
    OWNER = postgres
    ENCODING = 'UTF8'
    LC_COLLATE = 'C'
    LC_CTYPE = 'en_US.UTF-8'
    TABLESPACE = testts
    CONNECTION LIMIT = -1
    TEMPLATE = template0;

create table test1c (id integer, content varchar(10));
create index idx_test on test1c(content);

Нужна информация о сопоставлении на уровне таблицы и индекса.

1 Ответ

0 голосов
/ 08 июля 2019

Параметры сортировки столбца хранятся в attcollation строки pg_attribute столбца.Значение 100 означает «параметры сортировки по умолчанию», то есть параметры сортировки базы данных, хранящиеся в pg_database.

. Это способ найти параметры сортировки всех столбцов таблицы:

WITH defcoll AS (
   SELECT datcollate AS coll
   FROM pg_database
   WHERE datname = current_database()
)
SELECT a.attname,
       CASE WHEN c.collname = 'default'
            THEN defcoll.coll
            ELSE c.collname
       END AS collation
FROM pg_attribute AS a
   CROSS JOIN defcoll
   LEFT JOIN pg_collation AS c ON a.attcollation = c.oid
WHERE a.attrelid = 'test1c'::regclass
  AND a.attnum > 0
ORDER BY attnum;

 attname | collation 
---------+-----------
 id      | 
 content | C
(2 rows)

Для индексов параметры сортировки хранятся в столбце pg_index.indcollation:

WITH defcoll AS (
   SELECT datcollate AS coll
   FROM pg_database
   WHERE datname = current_database()
)
SELECT icol.pos,
       CASE WHEN c.collname = 'default'
            THEN defcoll.coll
            ELSE c.collname
       END AS collation
FROM pg_index AS i
   CROSS JOIN unnest(i.indcollation) WITH ORDINALITY AS icol(coll, pos)
   CROSS JOIN defcoll
   LEFT JOIN pg_collation AS c ON c.oid = icol.coll
WHERE i.indexrelid = 'idx_test'::regclass
ORDER BY icol.pos;

 pos | collation 
-----+-----------
   1 | C
(1 row)
...