PostgreSQL UTF-8 двоичная сортировка - PullRequest
7 голосов
/ 15 октября 2011

Я хотел бы иметь параметры сортировки, которые упорядочивают кодировку UTF-8 с 0x1234 ниже 0x1235 независимо от сопоставления символов в стандарте Unicode.MySQL использует utf8_bin для этого.MSSQL, по-видимому, http://msdn.microsoft.com/en-us/library/ms143350.aspx имеют параметры сортировки BIN и BIN2.Хотя найти их было легко, я даже не могу найти список сопоставлений, PostgreSQL поддерживает гораздо меньше ответов на этот конкретный вопрос.

Ответы [ 3 ]

6 голосов
/ 15 октября 2011

Язык Си будет делать.UTF-8 спроектирован так, что упорядочение байтов также является упорядочением кодовой точки.Это не тривиально, но рассмотрим, как работает UTF-8:

Number range  Byte 1   Byte 2   Byte 3
0000-007F     0xxxxxxx
0080-07FF     110xxxxx 10xxxxxx
0800-FFFF     1110xxxx 10xxxxxx 10xxxxxx

При сортировке двоичных данных, называемой языковым стандартом C, первый неравный байт будет определять источник.Что нам нужно, чтобы увидеть, что если два числа, закодированные в UTF-8, отличаются, то первый неравный байт будет меньше для более низкого значения.Если числа находятся в разных диапазонах, то первый байт действительно будет меньше для нижнего числа.В том же диапазоне порядок определяется буквально теми же битами, что и без кодирования.

5 голосов
/ 15 октября 2011

Порядок сортировки текста зависит от lc_collate (не от языкового стандарта системы!). Системный языковой стандарт используется по умолчанию только при создании кластера базы данных, если вы не указали другой языковой стандарт.

Ожидаемое поведение работает только с языком C. Читайте все об этом в прекрасном руководстве :

Параметры сортировки C и POSIX задают поведение "традиционного C", в только буквы ASCII от "A" до "Z" рассматриваются как буквы, и сортировка выполняется строго по значениям байтов кода символа .

Акцент мой. PostgreSQL 9.1 имеет несколько новых функций для сопоставления . Может быть именно то, что вы ищете.

1 голос
/ 15 октября 2011

Postgres использует параметры сортировки, определенные системным языком при создании кластера.

Вы можете попробовать ORDER BY кодировать (столбец, 'hex')

...