Eu tenho um banco de dados postgres em execução em uma imagem docker AL2023:
postgres=# select version();
select version();
version
----------------------------------------------------------------------------------------------------------
PostgreSQL 15.4 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 11.4.1 20230605 (Red Hat 11.4.1-2), 64-bit
(1 row)
postgres=#
Eu criei isso usando estes argumentos:
--locale-provider=icu --icu-locale=C.UTF8 --encoding=UTF8
O que produz o seguinte:
The database cluster will be initialized with this locale configuration:
provider: icu
ICU locale: C.UTF8
LC_COLLATE: C
LC_CTYPE: C
LC_MESSAGES: C
LC_MONETARY: C
LC_NUMERIC: C
LC_TIME: C
The default text search configuration will be set to "english".
Se eu pedir uma classificação entre maiúsculas e não maiúsculas, recebo letras minúsculas primeiro, o que (a) não é o que eu quero e (b) não é o que eu esperaria para ASCII/UTF-8/C
postgres=# select 'C' < 'c';
select 'C' < 'c';
?column?
----------
f
(1 row)
Então, se eu usasse o agrupamento C, faria o caminho certo, talvez?
postgres=# select 'C' < 'c' collate "C";
select 'C' < 'c' collate "C";
?column?
----------
t
(1 row)
Achei que estava usando C, então verifico qual agrupamento estou usando e obtenho ...
postgres=# select datname, datcollate from pg_database;
select datname, datcollate from pg_database;
datname | datcollate
-----------+------------
postgres | C
template1 | C
template0 | C
(3 rows)
Estou usando C - então por que o padrão não é o mesmo que se eu usasse C explicitamente?