HiveBrain v1.2.0
Get Started
← Back to all entries
debugsqlMinor

Default collation not working?

Submitted by: @import:stackexchange-dba··
0
Viewed 0 times
defaultnotworkingcollation

Problem

I don't understand why the default collation on my psqlserver 11 instance returns a different result than using with explicit collation.

Details:

show LC_CTYPE;        -- de-AT
show LC_COLLATE;      -- de-AT


When I use the default collation I get an unexpected output:

demo=# SELECT unnest(array['a','B', 'A']) order by 1;
 unnest 
--------
 A
 B
 a
(3 rows)


When I add the default collation explicitly, I get the expected output:

demo=# SELECT unnest(array['a','B', 'A']) collate "de-AT-x-icu" ORDER BY 1;
 unnest 
--------
 a
 A
 B
(3 rows)


The collation de-AT-x-icu uses exactly the default values for LC_COLLATE and LC_COLTYPE shown above:

SELECT collname, collcollate, collctype
FROM pg_collation
where collname like '%de-AT%';

  collname   | collcollate | collctype 
-------------+-------------+-----------
 de-AT-x-icu | de-AT       | de-AT


So I think both queries should return the same result: What am I missing?

More info:

  • postgresql version 11.5



  • OS inside the Docker container:



Linux 8660fb4cef84 4.9.184-linuxkit #1 SMP Tue Jul 2 22:58:16 UTC 2019 x86_64 Linux

Solution

Let me guess: you are using Alpine Linux, which uses musl as its C library, which uses ICU collations by default.

It is known that the collations in Alpine Linux don't work quite as they should, which is the cause of the problem. I am not sure if that is PostgreSQL's fault or not.

At any rate, you should use a different Linux distribution that uses glibc.

Context

StackExchange Database Administrators Q#252482, answer score: 2

Revisions (0)

No revisions yet.