Abecední řazení v Linuxu (LC_COLLATE)

Martin Edlman edlman na fortech.cz
Pondělí Duben 26 07:36:36 CEST 2010


-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Zdravím,

narazil jsem v PostgreSQL na problém se řazením, jak jsem následně
zjistil, není to problém PgSQL ale locale v systému (příkaz sort se
chová stejně jako order by v PgSQL).

Chci seřadit Zdvořilý, Zdražil, ZD Písek
Očekávám ZD Písek, Zdražil, Zdvořilý
Dostanu Zdražil, ZD Písek, Zdvořilý

Tedy mezera v ZD Písek se ignoruje a řadí se jako ZDPísek.

Řazení je ovlivněno nastavením LC_COLLATE, popř. LANG. V definičním
souboru /usr/share/i18n/locales/cs_CZ jsem našel poznámku

% Odlišnosti od normy:
% ....
% 3.2:
% Mezera se řadí před první písmeno abecedy, ale každý znak mezery je
% uvažován samostatně. Toto pravidlo je uplatněno na hesla, která jsou
% si jinak rovna (v prvních třech průchodech).

Pokud tomu rozumím, tak se mezera uvažuje až při shodě, takže ZD Písek
by se zařadil před ZDPísek (bez mezery shoda, mezera jde tedy dopředu).

Je možné změnit nějak jednoduše chování řazení? Lze něco změnit v
uvedeném souboru a překompilovat ho? Zkoušel jsem měnit řádek

<U0020> IGNORE;IGNORE;IGNORE;<U0020>

který by měl definovat chování na mezeře, ale byly to spíš jen takové
náhodné pokusy, syntaxi toho souboru moc nechápu.
Taky nevím jestli pak tento soubor zkompilovat, zkoušel jsem příkaz

# localedef -i /usr/share/i18n/locales/cs_CZ  /usr/share/locale/cs_CZ/

ale sort se chová stále stejně, žádný náznak změny.

Můžete mi prosím poradit?

Děkuji.

Martin Edlman

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.10 (GNU/Linux)
Comment: Using GnuPG with Fedora - http://enigmail.mozdev.org/

iEYEARECAAYFAkvVJmQACgkQqmMakYm+VJ/IsQCfd0wkTMfxhbhmZeLo2R2ywYn9
Bl8An0Qrd2ul4QRnvAdT3UUmUmkK40jK
=HeQD
-----END PGP SIGNATURE-----



Další informace o konferenci Linux