sql >> Base de Datos >  >> RDS >> PostgreSQL

PostgreSQL 9.1 usando la intercalación en declaraciones de selección

No puedo encontrar un defecto en tu diseño. Lo he intentado.

Configuraciones regionales y colación

Revisé esta pregunta. Considere este caso de prueba en sqlfiddle . Parece funcionar bien. Incluso creé la configuración regional ca_ES.utf8 en mi servidor de prueba local (PostgreSQL 9.1.6 en Debian Squeeze) y agregué la configuración regional a mi clúster de base de datos:

CREATE COLLATION "ca_ES" (LOCALE = 'ca_ES.utf8');

Obtengo los mismos resultados que se pueden ver en el sqlfiddle anterior.

Tenga en cuenta que los nombres de colación son identificadores y deben estar entre comillas dobles para preservar la ortografía CamelCase como "ca_ES" . ¿Quizás ha habido alguna confusión con otras configuraciones regionales en su sistema? Consulte sus intercalaciones disponibles :

SELECT * FROM pg_collation;

Por lo general, las reglas de intercalación se derivan de sistemas locales . Lea acerca de los detalles en el manual aquí . Si aún obtiene resultados incorrectos, intentaría actualizar su sistema y regenerar la configuración regional para "ca_ES" . En Debian (y distribuciones de Linux relacionadas) esto se puede hacer con:

dpkg-reconfigure locales

NFC

Tengo otra idea:cadenas UNICODE no normalizadas .

¿Será que tu 'Àudio' es de hecho '̀ ' || 'Audio' ? Ese sería este personaje:

SELECT U&'\0300A';
SELECT ascii(U&'\0300A');
SELECT chr(768);

Lea más sobre el acento agudo en wikipedia .
Tienes que SET standard_conforming_strings = TRUE para usar cadenas Unicode como en la primera línea.

Tenga en cuenta que algunos navegadores no pueden mostrar correctamente los caracteres Unicode no normalizados y muchas fuentes no tienen el glifo adecuado para los caracteres especiales, por lo que es posible que no vea nada aquí o que sea un galimatías. Pero UNICODE permite esas tonterías. Prueba para ver lo que obtuviste:

SELECT octet_length('̀A')  -- returns 3 (!)
SELECT octet_length('À')  -- returns 2

Si eso es lo que ha contratado su base de datos, debe deshacerse de él o sufrir las consecuencias. La cura es normalizar sus cadenas a NFC . Perl tiene habilidades superiores de UNICODE-foo, puede hacer uso de sus bibliotecas en una función plperlu para hacerlo en PostgreSQL. Lo he hecho para salvarme de la locura.

Lea las instrucciones de instalación en este excelente artículo sobre Normalización de UNICODE en PostgreSQL por David Wheeler .
Lea todos los detalles sangrientos sobre
Formularios de normalización de Unicode en unicode.org .