sql >> Databáze >  >> RDS >> PostgreSQL

PostgreSQL 9.1 používající třídění ve vybraných příkazech

Na tvém designu jsem nenašel chybu. Zkusil jsem.

Místa a řazení

Znovu jsem se k této otázce vrátil. Zvažte tento testovací případ na sqlfiddle . Zdá se, že to funguje dobře. Dokonce jsem vytvořil národní prostředí ca_ES.utf8 na mém místním testovacím serveru (PostgreSQL 9.1.6 na Debian Squeeze) a přidal jsem národní prostředí do mého clusteru DB:

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

Dostávám stejné výsledky, jaké lze vidět na sqlfiddle výše.

Názvy řazení jsou identifikátory a je třeba je uvést do dvojitých uvozovek, aby se zachoval pravopis CamelCase jako "ca_ES" . Možná došlo k záměně s jinými lokalitami ve vašem systému? Zkontrolujte dostupná kolace :

SELECT * FROM pg_collation;

Pravidla řazení jsou obecně odvozena z míst systému . Přečtěte si o podrobnostech v příručce zde . Pokud stále máte nesprávné výsledky, pokusil bych se aktualizovat váš systém a znovu vytvořit národní prostředí pro "ca_ES" . V Debianu (a souvisejících distribucích Linuxu) to lze provést pomocí:

dpkg-reconfigure locales

NFC

Mám ještě jeden nápad:nenormalizované řetězce UNICODE .

Může to být váš 'Àudio' je ve skutečnosti '̀ ' || 'Audio' ? To by byla tato postava:

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

Přečtěte si více o akutním přízvuku na wikipedii .
Musíte SET standard_conforming_strings = TRUE použít řetězce Unicode jako v prvním řádku.

Všimněte si, že některé prohlížeče nedokážou správně zobrazit nenormalizované znaky Unicode a mnoho písem nemá žádný správný glyf pro speciální znaky, takže zde nemusíte nic vidět nebo jsou nesmyslné. UNICODE ale tyto nesmysly umožňuje. Vyzkoušejte, co máte:

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

Pokud je to to, co vaše databáze nasmlouvala, musíte se toho zbavit nebo nést následky. Lék je normalizovat vaše řetězce na NFC . Perl má vynikající schopnosti UNICODE-foo, můžete použít jejich knihovny ve funkci plperlu, abyste to udělali v PostgreSQL. Udělal jsem to, abych se zachránil před šílenstvím.

Přečtěte si pokyny k instalaci v tomto skvělém článku o normalizaci UNICODE v PostgreSQL od Davida Wheelera .
Přečtěte si všechny krvavé podrobnosti o Formulářích pro normalizaci Unicode na unicode.org .



  1. Zkontrolujte, zda tabulka existuje, a pokud neexistuje, vytvořte ji v SQL Server 2008

  2. MAX() vs GREATEST() v MySQL:Jaký je rozdíl?

  3. Postgres NENÍ VE VÝKONU

  4. Jak určit `pořadí podle` na nejednoznačném sloupci pomocí jarní dávky a postgres?