2011-10-15 22 views
6

Me gustaría tener una intercalación que ordena la codificación UTF-8 de 0x1234 a continuación de 0x1235, independientemente de la asignación de caracteres en el estándar Unicode. MySQL usa utf8_bin para esto. MSSQL aparentemente http://msdn.microsoft.com/en-us/library/ms143350.aspx tiene intercalaciones BIN y BIN2. Si bien encontrar estos fue fácil, ni siquiera puedo encontrar una lista de intercalaciones PostgreSQL admite mucho menos respuesta a esta pregunta específica.PostgreSQL UTF-8 colación binaria

Respuesta

5

La configuración regional C funcionará. UTF-8 está diseñado para que el orden de bytes también sea un pedido de punto de código. Esto no es trivial pero tenga en cuenta la forma en UTF-8 funciona:

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

Al ordenar los datos binarios también conocido como C local, el primer byte no será igual etermine orering. Lo que necesitamos saber es que si dos números codificados en UTF-8 difieren, entonces el primer byte no igual será menor para el valor inferior. Si los números están en rangos diferentes, entonces el primer byte será más bajo para el número más bajo. Dentro del mismo rango, el orden está determinado literalmente por los mismos bits que sin codificación.

+0

Esa es una clasificación de punto de código, que es completamente inútil en Unicode. ¿Cómo se hace para que haga un orden alfabético apropiado usando el algoritmo de clasificación requerido por Unicode en su algoritmo de intercalación Unicode? – tchrist

+2

@tchrist: Esa no es la pregunta. –

1

Postgres usa la intercalación definida por la configuración regional del sistema en la creación del clúster.

Se podría tratar de ordenar antes de codificar (columna, 'hexagonal')

5

Ordenar orden de texto depende de lc_collate (no en la región del sistema!). La configuración regional del sistema solo sirve como valor predeterminado al crear el clúster db si no proporciona otra configuración regional.

El comportamiento que espera solo funciona con la configuración regional C. Leer todo sobre ella in the fine manual:

Las colaciones C y POSIX tanto especificar el comportamiento de "C tradicional", en cuales sólo las letras ASCII "A" a la "Z" son tratados como cartas, se hace y clasificación estrictamente por valores de bytes de código de carácter.

Énfasis mío. PostgreSQL 9.1 tiene un par de new features for collation. Puede ser exactamente lo que estás buscando.

+0

¿Cómo se hace hacer una ordenación alfabética en lugar de una clasificación de punto de código? Ya sabes, para que use el Algoritmo de intercalación Unicode. De lo contrario, nunca obtendrá una ordenación alfabética en texto Unicode. – tchrist

+0

@tchrist: Normalmente tiene 'lc_collate' establecido en su configuración regional. Ejemplo: en Inglaterra, probablemente tendrías 'lc_collate' establecido en' en_EN.utf8'. Pruebe 'SHOW lc_collate;' para ver su configuración. Sigue el enlace en mi respuesta para más información. –