Base on this thread:
https://www.postgresql.org/message-id/20220305083830.lpz3k3yku5lmm5xs%40jrouhaud
ordering reference:
https://unicode-org.github.io/cldr-staging/charts/latest/collation/en_US_POSIX.html

<https://www.postgresql.org/message-id/20220305083830.lpz3k3yku5lmm5xs%40jrouhaud>CREATE
DATABASE dbicu1 LOCALE_PROVIDER icu LOCALE 'en_US.UTF-8' ICU_LOCALE
'en-u-kf-upper' TEMPLATE 'template0';
CREATE DATABASE dbicu2 LOCALE_PROVIDER icu LOCALE 'en_US.UTF-8' ICU_LOCALE
'en-u-kr-latn-digit' TEMPLATE 'template0';
--same script apply to dbicu1 dbicu2
BEGIN;
CREATE COLLATION upperfirst (
    provider = icu,
    locale = 'en-u-kf-upper'
);
CREATE TABLE icu (
    def text,
    en text COLLATE "en_US",
    upfirst text COLLATE upperfirst,
    test_kr text
);
INSERT INTO icu
    VALUES ('a', 'a', 'a', '1 a'), ('b', 'b', 'b', 'A 11'), ('A', 'A', 'A',
'A 19'), ('B', 'B', 'B', '8 p');
INSERT INTO icu
    VALUES ('a', 'a', 'a', 'a 7');
INSERT INTO icu
    VALUES ('a', 'a', 'a', 'Œ 1');
COMMIT;
-----------------------
--dbicu1
SELECT def AS def FROM icu ORDER BY def; --since only character. all works
fine.
SELECT test_kr FROM icu  ORDER BY def;
/*
  test_kr
---------
 A 19
 1 a
 a 7
 Œ 1
 8 p
 A 11
 */


--dbicu2
SELECT def AS def FROM icu ORDER BY def; --since only character. all works
fine.
SELECT test_kr FROM icu  ORDER BY def;
/*
 test_kr
---------
 1 a
 a 7
 Œ 1
 A 19
 A 11
 8 p
(6 rows)
*/

Since dbicu1 and dbicu2 set the default collation then
In dbicu1, I should expect the ordering:
 number >> Upper case alphabet letter  >> lower case alphabet letter>>
character Œ (U+0153)

In dbicu2, I should expect the ordering:
 lower case  alphabet letter >> Upper case alphabet letter >> number >>
character Œ (U+0153)

As you can see one letter works fine for dbicu1, dbicu2. However, it does
not work on more characters.
Or The result is correct, but something I misunderstood?

I am not sure this is my personal misunderstanding.
In the above examples, the first character of column *test_kr*
is so different that the comparison is based on the first letter.
If the first letter is the same then compute the second letter..
So for whatever collation, I should expect 'A 19' to be adjacent with 'A
11'?



-- 
 I recommend David Deutsch's <<The Beginning of Infinity>>

  Jian

Reply via email to