Postgresql 数据库级别、table 级别、列级别的排序规则
Collation in Postgresql DB level,table level, column level
我使用 UTF8 字符集的排序规则类型 'C' 创建了数据库。如果我在同一数据库下创建任何 table 或索引,它将具有排序规则 'C' 或我需要在 table 或索引创建时明确定义。
我们如何提取 postgresql 11
中 table 和索引的整理细节
使用整理创建的数据库 'C' 还创建了 table 和没有明确整理类型的索引。
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);
需要有关 table 和索引级别整理的信息。
列的排序规则存储在列的 pg_attribute
行的 attcollation
中。值 100 表示“默认排序规则”,这是存储在 pg_database
.
中的数据库排序规则
这是一种查找 table 所有列排序规则的方法:
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)
我使用 UTF8 字符集的排序规则类型 'C' 创建了数据库。如果我在同一数据库下创建任何 table 或索引,它将具有排序规则 'C' 或我需要在 table 或索引创建时明确定义。
我们如何提取 postgresql 11
中 table 和索引的整理细节使用整理创建的数据库 'C' 还创建了 table 和没有明确整理类型的索引。
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);
需要有关 table 和索引级别整理的信息。
列的排序规则存储在列的 pg_attribute
行的 attcollation
中。值 100 表示“默认排序规则”,这是存储在 pg_database
.
这是一种查找 table 所有列排序规则的方法:
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)