PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

PostgreSQL 9.1 usando collate nelle istruzioni select

Non riesco a trovare un difetto nel tuo design. Ho provato.

Impostazioni locali e regole di confronto

Ho rivisitato questa domanda. Considera questo test case su sqlfiddle . Sembra funzionare bene. Ho anche creato la locale ca_ES.utf8 nel mio server di prova locale (PostgreSQL 9.1.6 su Debian Squeeze) e ho aggiunto la locale al mio cluster DB:

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

Ottengo gli stessi risultati che si possono vedere in sqlfiddle sopra.

Nota che i nomi delle regole di confronto sono identificatori e devono essere virgolette per preservare l'ortografia CamelCase come "ca_ES" . Forse c'è stata qualche confusione con altre localizzazioni nel tuo sistema? Controlla le tue collazioni disponibili :

SELECT * FROM pg_collation;

In genere, le regole di confronto sono derivate da località di sistema . Leggi i dettagli nel manuale qui . Se continui a ricevere risultati errati, proverei ad aggiornare il tuo sistema e rigenerare la locale per "ca_ES" . In Debian (e nelle relative distribuzioni Linux) questo può essere fatto con:

dpkg-reconfigure locales

NFC

Ho un'altra idea:stringhe UNICODE non normalizzate .

Potrebbe essere il tuo 'Àudio' è infatti '̀ ' || 'Audio' ? Questo sarebbe questo personaggio:

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

Ulteriori informazioni sull'accento acuto in wikipedia .
Devi SET standard_conforming_strings = TRUE per utilizzare stringhe Unicode come nella prima riga.

Nota che alcuni browser non possono visualizzare correttamente i caratteri Unicode non normalizzati e molti caratteri non hanno glifi appropriati per i caratteri speciali, quindi potresti non vedere nulla qui o incomprensibile. Ma UNICODE consente questa sciocchezza. Prova per vedere cosa hai:

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

Se questo è ciò che il tuo database ha contratto, devi liberartene o subirne le conseguenze. La cura è normalizzare le tue stringhe in NFC . Perl ha abilità UNICODE-foo superiori, puoi usare le loro librerie in una funzione plperlu per farlo in PostgreSQL. L'ho fatto per salvarmi dalla follia.

Leggi le istruzioni di installazione in questo eccellente articolo sulla normalizzazione UNICODE in PostgreSQL di David Wheeler .
Leggi tutti i dettagli cruenti su Moduli di normalizzazione Unicode su unicode.org .