sql >> Databasteknik >  >> RDS >> PostgreSQL

PostgreSQL 9.1 använder sortering i utvalda uttalanden

Jag kan inte hitta något fel i din design. Jag har försökt.

Lokaler och sortering

Jag tog upp den här frågan igen. Tänk på det här testfallet på sqlfiddle . Det verkar fungera bra. Jag skapade till och med språket ca_ES.utf8 i min lokala testserver (PostgreSQL 9.1.6 på Debian Squeeze) och la till språket i mitt DB-kluster:

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

Jag får samma resultat som kan ses i sqlfiddle ovan.

Observera att sorteringsnamn är identifierare och måste ha dubbla citattecken för att bevara CamelCase stavning som "ca_ES" . Kanske har det uppstått en viss förvirring med andra lokaler i ditt system? Kontrollera dina tillgängliga sorteringar :

SELECT * FROM pg_collation;

I allmänhet härleds sorteringsregler från systemlokaler . Läs om detaljerna i manualen här . Om du fortfarande får felaktiga resultat skulle jag försöka uppdatera ditt system och återskapa språket för "ca_ES" . I Debian (och relaterade Linux-distributioner) kan detta göras med:

dpkg-reconfigure locales

NFC

Jag har en annan idé:onormaliserade UNICODE-strängar .

Kan det vara så att din 'Àudio' är faktiskt '̀ ' || 'Audio' ? Det skulle vara den här karaktären:

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

Läs mer om den akuta accenten på wikipedia .
Du måste SET standard_conforming_strings = TRUE för att använda Unicode-strängar som på första raden.

Observera att vissa webbläsare inte kan visa onormaliserade Unicode-tecken korrekt och många teckensnitt har ingen riktig glyph för specialtecknen, så du kanske inte ser något här eller skratt. Men UNICODE tillåter det nonsens. Testa för att se vad du fick:

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

Om det är det som din databas har fått, måste du bli av med den eller ta konsekvenserna av det. Botemedlet är att normalisera dina strängar till NFC . Perl har överlägsna UNICODE-foo-färdigheter, du kan använda deras bibliotek i en plperlu-funktion för att göra det i PostgreSQL. Jag har gjort det för att rädda mig från galenskapen.

Läs installationsinstruktionerna i denna utmärkta artikel om UNICODE-normalisering i PostgreSQL av David Wheeler .
Läs alla blodiga detaljer om Unicode Normalization Forms på unicode.org .



  1. Python Pandas - Använda to_sql för att skriva stora dataramar i bitar

  2. Oracle:Varför Oracle skapar en redo-ändringsvektor som beskriver ändringen av ångra-blocket när användaren utfärdar en instruktion för att ändra en datapost

  3. Hur skriver man en facklig fråga i doktrin?

  4. Hur man installerar MySQL på CentOS 6