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

PostgreSQL 9.1 ved hjælp af collate i udvalgte udsagn

Jeg kan ikke finde en fejl i dit design. Jeg har prøvet.

Lokaler og sortering

Jeg gentog dette spørgsmål. Overvej denne testcase på sqlfiddle . Det ser ud til at fungere fint. Jeg oprettede endda lokaliteten ca_ES.utf8 i min lokale testserver (PostgreSQL 9.1.6 på Debian Squeeze) og tilføjede lokaliteten til min DB-klynge:

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

Jeg får de samme resultater, som kan ses i sqlfiddle ovenfor.

Bemærk, at sorteringsnavne er identifikatorer og skal anføres i dobbelte anførselstegn for at bevare CamelCase-stavning som "ca_ES" . Måske har der været en vis forvirring med andre lokaliteter i dit system? Tjek dine tilgængelige sorteringer :

SELECT * FROM pg_collation;

Generelt er sorteringsregler afledt fra systemlokaliteter . Læs om detaljerne i manualen her . Hvis du stadig får forkerte resultater, vil jeg prøve at opdatere dit system og genskabe lokaliteten for "ca_ES" . I Debian (og relaterede Linux-distributioner) kan dette gøres med:

dpkg-reconfigure locales

NFC

Jeg har en anden idé:unormaliserede UNICODE-strenge .

Kan det være din 'Àudio' er faktisk '̀ ' || 'Audio' ? Det ville være denne karakter:

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

Læs mere om den akutte accent i wikipedia .
Du skal SET standard_conforming_strings = TRUE at bruge Unicode-strenge som i den første linje.

Bemærk, at nogle browsere ikke kan vise unormaliserede Unicode-tegn korrekt, og mange skrifttyper har ingen korrekt glyph for specialtegnene, så du kan muligvis ikke se noget her eller vrøvl. Men UNICODE giver mulighed for det sludder. Test for at se, hvad du har fået:

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

Hvis det er det, din database har indgået aftale om, skal du slippe af med den eller lide konsekvenserne. Kuren er at normalisere dine strenge til NFC . Perl har overlegne UNICODE-foo-færdigheder, du kan gøre brug af deres biblioteker i en plperlu-funktion til at gøre det i PostgreSQL. Det har jeg gjort for at redde mig fra vanvid.

Læs installationsinstruktioner i denne fremragende artikel om UNICODE-normalisering i PostgreSQL af David Wheeler .
Læs alle de blodige detaljer om Unicode-normaliseringsformularer på unicode.org .



  1. Sådan kalder du en funktion med Rowtype-parameter fra en select-sætning i Oracle

  2. hvorfor ændre mysql min kodevisning?

  3. Sådan bruger du Perl til at ændre en mysql-adgangskode

  4. relevanssøgning på tværs af flere relaterede tabeller