<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>JAVA_HOME &#187; PostgreSQL</title>
	<atom:link href="http://javahome.wordpress.com/category/bazy-danych/postgresql/feed/" rel="self" type="application/rss+xml" />
	<link>http://javahome.wordpress.com</link>
	<description>Java, IT, MTB</description>
	<lastBuildDate>Sat, 29 Aug 2009 18:18:54 +0000</lastBuildDate>
	<generator>http://wordpress.com/</generator>
	<language>pl</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<cloud domain='javahome.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://www.gravatar.com/blavatar/1b4f37893003f1a4f8f9fdac27dfad67?s=96&#038;d=http://s.wordpress.com/i/buttonw-com.png</url>
		<title>JAVA_HOME &#187; PostgreSQL</title>
		<link>http://javahome.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://javahome.wordpress.com/osd.xml" title="JAVA_HOME" />
		<item>
		<title>Ciekawy artykuł o perspektywach zmaterializowanych w PostgreSQL</title>
		<link>http://javahome.wordpress.com/2008/06/18/ciekawy-artykul-o-perspektywach-zmaterializowanych-w-postgresql/</link>
		<comments>http://javahome.wordpress.com/2008/06/18/ciekawy-artykul-o-perspektywach-zmaterializowanych-w-postgresql/#comments</comments>
		<pubDate>Tue, 17 Jun 2008 23:53:10 +0000</pubDate>
		<dc:creator>Jarek</dc:creator>
				<category><![CDATA[PostgreSQL]]></category>
		<category><![CDATA[Bazy danych]]></category>
		<category><![CDATA[perspektywy zmaterializowane]]></category>

		<guid isPermaLink="false">http://javahome.wordpress.com/?p=12</guid>
		<description><![CDATA[PostgreSQL niestety nie ma wbudowanej obsługi perspektyw zmaterializowanych, ale jak się okazuje niektóre ich typy można łatwo zrealizować za pomocą zwykłych widoków, tabel i odpowiednich triggerów. Jak to zrobić opisane jest w artykule Jonathana Gardnera, który znajduje się tutaj: http://www.jonathangardner.net/tech/w/PostgreSQL/Materialized_Views.
       <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=javahome.wordpress.com&blog=3571764&post=12&subd=javahome&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>PostgreSQL niestety nie ma wbudowanej obsługi perspektyw zmaterializowanych, ale jak się okazuje niektóre ich typy można łatwo zrealizować za pomocą zwykłych widoków, tabel i odpowiednich triggerów. Jak to zrobić opisane jest w artykule Jonathana Gardnera, który znajduje się tutaj: <a href="http://www.jonathangardner.net/tech/w/PostgreSQL/Materialized_Views">http://www.jonathangardner.net/tech/w/PostgreSQL/Materialized_Views</a>.</p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/javahome.wordpress.com/12/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/javahome.wordpress.com/12/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/javahome.wordpress.com/12/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/javahome.wordpress.com/12/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/javahome.wordpress.com/12/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/javahome.wordpress.com/12/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/javahome.wordpress.com/12/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/javahome.wordpress.com/12/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/javahome.wordpress.com/12/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/javahome.wordpress.com/12/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/javahome.wordpress.com/12/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/javahome.wordpress.com/12/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=javahome.wordpress.com&blog=3571764&post=12&subd=javahome&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://javahome.wordpress.com/2008/06/18/ciekawy-artykul-o-perspektywach-zmaterializowanych-w-postgresql/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/8200f571585028bb6e1700af5c2c74bc?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Jarek</media:title>
		</media:content>
	</item>
		<item>
		<title>Sortowanie w PostgreSQL</title>
		<link>http://javahome.wordpress.com/2008/06/10/sortowanie-w-postgresql/</link>
		<comments>http://javahome.wordpress.com/2008/06/10/sortowanie-w-postgresql/#comments</comments>
		<pubDate>Tue, 10 Jun 2008 01:15:10 +0000</pubDate>
		<dc:creator>Jarek</dc:creator>
				<category><![CDATA[PostgreSQL]]></category>
		<category><![CDATA[locale]]></category>
		<category><![CDATA[sortowanie]]></category>

		<guid isPermaLink="false">http://javahome.wordpress.com/?p=10</guid>
		<description><![CDATA[Sortowanie w PostgreSQL uwzględniające zasady obowiązujące dla konkretnego języka może być dość kłopotliwe. Niestety PostgreSQL nie pozwala na dynamiczne zmienianie sposobu sortowania tak jak jest to możliwe w MySQL (klauzula COLLATE) albo w Oraclu (parametr sesji NLS_SORT), tylko wymaga podania sposobu sortowania podczas tworzenia klastra (parametry &#8211;locale, &#8211;lc-collate i poniekąd &#8211;lc-ctype polecenia initdb) i później [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=javahome.wordpress.com&blog=3571764&post=10&subd=javahome&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Sortowanie w PostgreSQL uwzględniające zasady obowiązujące dla konkretnego języka może być dość kłopotliwe. Niestety PostgreSQL nie pozwala na dynamiczne zmienianie sposobu sortowania tak jak jest to możliwe w MySQL (klauzula COLLATE) albo w Oraclu (parametr sesji NLS_SORT), tylko wymaga podania sposobu sortowania podczas tworzenia klastra (parametry &#8211;locale, &#8211;lc-collate i poniekąd &#8211;lc-ctype polecenia initdb) i później już parametry te pozostają niezmienne.</p>
<p>Jest to niewątpliwa wada jeśli chciałoby się przechowywać w bazie dane w wielu językach. Sytuacje poprawia nieco fakt, że przy locale bazujących na normie ISO14651 (a jest to chyba większość locales w nowoczesnych linuxach) sortowanie w wielu językach jest w miarę poprawne bez względu na wybrane locale.</p>
<p>Np. w przypadku Ubuntu 7 i 8 polskie napisy sortują się poprawnie zarówno przy locale pl_PL.utf8 jak i en_US.utf8, co można sprawdzić wykonując polecenia (PostgreSQL będzie sortował identycznie przy tym samym locale):</p>
<p><code>echo -e "ą\na\nb\nc\nć\nł\nz\nż\nź" |LC_ALL=pl_PL.utf8 sort</code><br />
<code>echo -e "ą\na\nb\nc\nć\nł\nz\nż\nź" |LC_ALL=en_US.utf8 sort</code></p>
<p>Natomiast przy locale ustawionym na POSIX lub C sortowanie nie będzie poprawne, ponieważ w tym przypadku porównywane są poprostu binarne kody znaków i polskie litery lądują na końcu.</p>
<p>Wróćmy na razie do PostgreSQL. Jeżeli podczas wykonywania initdb nie podaliśmy explicite parametrów &#8211;locale, &#8211;lc-collate i/lub &#8211;lc-ctype to initdb pobiera wartości tych parametrów ze zmiennych systemowych LC_ALL w pierwszej kolejności, LC_COLLATE oraz LC_CTYPE jeśli LC_ALL nie jest ustawione i LANG jeśli poprzednie zmienne również nie były ustawione. Jeśli żadna z tych zmiennych nie jest ustawiona to locale jest ustawiane na C.</p>
<p>Czyli jeśli korzystamy z klastra stworzonego np. automatycznie przy instalacji PostgreSQL, to może się zdażyć, że locale będzie inne niż byśmy sobie tego życzyli. Najlepiej w tami wypadku klaster usunąć (po wkonaniu backupu) i stworzyć ręcznie od nowa z odpowiednim locale. W Ubuntu można się zamiast initdb posłużyć wygodniejszym pg_createcluster.</p>
<p>OK, ustawiliśmy sobie locale na pl_PL.utf8 i badamy dalej sortowanie (dla ułatwienia eksperymentów posługuję się dalej kombinacją poleceń echo/sort &#8211; PostgreSQL będzie sortował tak samo):</p>
<p><code>echo -e "język polski\njęzyk angielski\njęzykowy\njęzyk-language\njęzyka\njęzyk" |LC_ALL=pl_PL.utf8 sort</code></p>
<p>W efekcie dostajemy taki porządek sortowania:</p>
<pre>język
języka
język-language
językowy
język angielski
język polski</pre>
<p>Nie wygląda to najlepiej i nie jest zgodne z polskimi zasadami sortowania (są one dość dobrze opisane np. tutaj: <a title="Reguły sortowania" href="http://www.ia.pw.edu.pl/~wujek/tex/idx/porzadek.html#reguly" target="_blank">http://www.ia.pw.edu.pl/~wujek/tex/idx/porzadek.html#reguly</a>). Lepiej by było gdyby napisy zostały posortowane następująco:</p>
<pre>język
język angielski
język polski
język-language
języka
językowy</pre>
<p>Jak coś takiego osiągnąć? Trzeba nieco zmienić plik z definicją locale.</p>
<p>Pliki źródłowe definiujące zasady obowiązujące dla poszczególnych locale znajdują się w katalogu /usr/share/i18n/locales. Najlepiej nie zmieniać standardowego polskiego locale pl_PL tylko stworzyć jego inny wariant np. pl_PL@bettersort. W tym celu kopijemy plik pl_PL i zabieramy się za jego edycję.</p>
<p>Interesuje nas sekcja LC_COLLATE a szczególnie fragment:</p>
<p><code>reorder-after &lt;U00A0&gt;<br />
&lt;U0020&gt; &lt;U0020&gt;;IGNORE;&lt;U0020&gt;;&lt;U0020&gt;</code></p>
<p>Zmieniamy go na następujący:</p>
<p><code>reorder-after &lt;RES-1&gt;<br />
&lt;U0020&gt; &lt;U0020&gt;;IGNORE;&lt;U0020&gt;;&lt;U0020&gt;<br />
&lt;U00A0&gt; &lt;U0020&gt;;IGNORE;&lt;U0020&gt;;&lt;U00A0&gt;<br />
&lt;U002D&gt; &lt;U002D&gt;;IGNORE;&lt;U002D&gt;;&lt;U002D&gt;<br />
&lt;U2010&gt; &lt;U002D&gt;;IGNORE;&lt;U002D&gt;;&lt;U2010&gt;<br />
&lt;U2011&gt; &lt;U002D&gt;;IGNORE;&lt;U002D&gt;;&lt;U2011&gt;<br />
&lt;U2012&gt; &lt;U002D&gt;;IGNORE;&lt;U002D&gt;;&lt;U2012&gt;<br />
&lt;U2013&gt; &lt;U002D&gt;;IGNORE;&lt;U002D&gt;;&lt;U2013&gt;<br />
&lt;U2212&gt; &lt;U002D&gt;;IGNORE;&lt;U002D&gt;;&lt;U2212&gt;</code></p>
<p>Co to oznacza? Symbol RES-1 to symbol specjalny znajdujący się w porządku sortowania przed wszystkimi innymi znakami. Polecenie reorder-after &lt;RES-1&gt; powoduje wstawienie w porządku sortowania symboli znajdujących się w kolejnych linijkach właśnie za symbolem RES-1, a więc na pewno przed wszystkimi innymi znakami. Dwie pierwsze linijki zaczynające się od symboli &lt;U0020&gt; i &lt;U00A0&gt; są odpowiedzialne za sortowanie zwykłej spacji i spacji nieroździlającej (nbsp). Kolejne linijki to różne wersje dywizu i myślnika.</p>
<p>Po wyedytowaniu tego pliku należy jeszcze dopisać go do listy obsługiwanych locale  znajdującej się w pliku /usr/share/i18n/SUPPORTED. Dodajemy tam wpis:</p>
<p><code>pl_PL.UTF-8@bettersort UTF-8</code></p>
<p>Następnie trzeba skompilować nasze nowe locale poleceniem:</p>
<p><code>sudo locale-gen pl_PL.UTF-8@bettersort</code></p>
<p>Sprawdzamy jeszcze czy wszystko się udało poleceniem: locale -a i testujemy sortowanie:</p>
<p><code>echo -e "język polski\njęzyk angielski\njęzykowy\njęzyk-language\njęzyka\njęzyk" |LC_ALL=pl_PL@bettersort.utf8 sort</code></p>
<p>Powinniśmy dostać poprawne sortowanie.</p>
<p>Pozstaje nam jeszcze stworzenie od nowa klsatra PostgreSQL poleceniem:</p>
<p><code>sudo pg_createcluster --locale=pl_PL.utf8@bettersort --lc-messages=en_US.utf8 --start 8.3 main</code></p>
<p>W tak stworzonej bazie sortowanie powinno być poprawne.</p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/javahome.wordpress.com/10/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/javahome.wordpress.com/10/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/javahome.wordpress.com/10/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/javahome.wordpress.com/10/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/javahome.wordpress.com/10/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/javahome.wordpress.com/10/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/javahome.wordpress.com/10/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/javahome.wordpress.com/10/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/javahome.wordpress.com/10/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/javahome.wordpress.com/10/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/javahome.wordpress.com/10/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/javahome.wordpress.com/10/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=javahome.wordpress.com&blog=3571764&post=10&subd=javahome&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://javahome.wordpress.com/2008/06/10/sortowanie-w-postgresql/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/8200f571585028bb6e1700af5c2c74bc?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Jarek</media:title>
		</media:content>
	</item>
	</channel>
</rss>