sql >> Database >  >> RDS >> PostgreSQL

PostgreSQL 9.1 met behulp van sorteren in select-statements

Ik kan geen fout vinden in je ontwerp. Ik heb het geprobeerd.

Locales en sortering

Ik heb deze vraag opnieuw bekeken. Overweeg deze testcase over sqlfiddle . Het lijkt gewoon goed te werken. Ik heb zelfs de landinstelling ca_ES.utf8 gemaakt in mijn lokale testserver (PostgreSQL 9.1.6 op Debian Squeeze) en de landinstelling toegevoegd aan mijn DB-cluster:

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

Ik krijg dezelfde resultaten als in de bovenstaande sqlfiddle.

Merk op dat sorteernamen identificaties zijn en dubbele aanhalingstekens nodig hebben om CamelCase-spelling zoals "ca_ES" te behouden . Misschien is er wat verwarring geweest met andere locales in uw systeem? Controleer uw beschikbare sorteringen :

SELECT * FROM pg_collation;

Over het algemeen zijn sorteerregels afgeleid van systeemlandinstellingen . Lees hier over de details in de handleiding . Als u nog steeds onjuiste resultaten krijgt, zou ik proberen uw systeem bij te werken en de landinstelling voor "ca_ES" opnieuw te genereren . In Debian (en gerelateerde Linux-distributies) kan dit met:

dpkg-reconfigure locales

NFC

Ik heb nog een ander idee:niet-genormaliseerde UNICODE-tekenreeksen .

Kan het zijn dat uw 'Àudio' is in feite '̀ ' || 'Audio' ? Dat zou dit karakter zijn:

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

Lees meer over het acute accent in wikipedia .
Je moet SET standard_conforming_strings = TRUE om Unicode-strings te gebruiken zoals in de eerste regel.

Merk op dat sommige browsers niet-genormaliseerde Unicode-tekens niet correct kunnen weergeven en dat veel lettertypen geen juiste glyph hebben voor de speciale tekens, dus het kan zijn dat u hier niets of gebrabbel ziet. Maar UNICODE laat die onzin toe. Test om te zien wat je hebt:

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

Als dat is wat uw database heeft opgelopen, moet u zich ervan ontdoen of de gevolgen ondervinden. De remedie is om je strings te normaliseren naar NFC . Perl heeft superieure UNICODE-foo-vaardigheden, je kunt hun bibliotheken gebruiken in een plperlu-functie om het in PostgreSQL te doen. Ik heb dat gedaan om me te redden van waanzin.

Lees installatie-instructies in dit uitstekende artikel over UNICODE-normalisatie in PostgreSQL door David Wheeler .
Lees alle bloederige details over
Unicode Normalization Forms op unicode.org .



  1. Tijdinformatie opslaan:Tijdzone vereist?

  2. Gebruik een Postgres-trigger om de JSON van alleen de gewijzigde velden vast te leggen

  3. MySQL-tellingsgegevens voor de afgelopen 7 dagen

  4. CodeIgniter Active Record - Groeps-OR-instructies