Заказ Postgres UTF8 - PullRequest
       9

Заказ Postgres UTF8

1 голос
/ 01 марта 2012

У меня есть этот запрос в Postgres, где я упорядочиваю небольшое количество строк в соответствии с полем varchar.Кажется, есть ошибка при упорядочении строк UTF8 в Postgres:

Например:

'W' в UTF-8 равно 87, в то время как 'g' равно 103, но работает SELECT 'W' < 'g';вернет false во время работы SELECT convert_to('W', 'SQL_ASCII') < convert_to('g', 'SQL_ASCII')'; вернет true.

Сортировка: en_US.UTF-8.

Есть ли хорошее объяснение этому поведению?И как этого избежать?

Ответы [ 2 ]

1 голос
/ 06 марта 2012

Это покажет порядок сортировки ascii некоторых первых кодовых точек Юникода, если вы используете кодировку utf8:

select s, chr(s) from generate_series(32, 255) s order by chr(s) collate "C";

Теперь то же самое для сортировки pt_BR (бразильский португальский):

select s, chr(s) from generate_series(32, 255) s order by chr(s) collate "pt_BR";

То, что вы называете сопоставлением (en_US.UTF-8), - это сопоставление перед точкой и кодировка после точки.

0 голосов
/ 01 марта 2012

Порядок указывается не в кодовых точках Юникода, а в соответствии с параметрами сортировки.И в UTF-8 у нас есть 'A' <'a' <'B' <'b' и т. Д. </p>

Большинство людей (кроме кодировщиков) ожидают такой порядок.Но не стесняйтесь сопоставлять с ASCII там, где вам это нужно.

...