2.6 Proč nemohu vybrat Unicode jako kódování
Poznámka: PostgreSQL 8.1 plně podporuje UTF8 (UNICODE) v o.s. Windows. Tento bod platí pouze pro PostgreSQL 8.0.
V případě PostgreSQL UTF-8 je UNICODE a to není úplně podporováno windowsy, tudíž toto kódování nemohlo být použito. Instalátor povolí pouze ta kódování, která jsou podporována jak PostgreSQL, tak i Windows.
Problém popsal Aleksander Kmetec v konferenci pgsql-hackers:
PostgreSQL používá některé systémové funkce pro operace s řetězci. Proto musí OS podporovat stejné kódování jaké je použito pro databázi. Naneštěstí, Windows nepodporuje některá kódování, která jsou dostupná na straně serveru PostgreSQL.
Pro názornost uvedu malý příklad: Mám UNICODE databázi (konkrétně UTF8). V mém případě odpovídající národní podpora (pro initdb) je sl_SI.utf8 (na Linuxu) nebo Slovenian_Slovenia.65001 (na Windows).
65001 je kódovací stránka Windows pro utf8, až na to, že to není vlastně skutečná a správná kódovací stránka. Dokument, který byl původně na adrese http://www.sharmahd.com/tm/codepages.html, nyní ke vší smůle zrušený, konstatuje, že:
65000 (UTF-7) a 65001 (UTF-8) jsou pseudo kódovací stránky. Neexistují k nim korespondující NLS soubory. Identifikátor kódové stránky může být použit pouze ve API funkcích WideCharToMultiByte() a MultiByteToWideChar().
Což znamená, že UPPER(), LOWER() a ORDER BY nebudou korektně pracovat v databázích v kódování UNICODE. V současné době nelze spustit initdb s národní podporou, které používá kódování 65001. Malou úpravou initdb jsem nastavil LC_COLLATE na Slovenian_Slovenia.65001. Přes toto nastavení třídění nebylo korektní, což je pochopitelné, viz zmíněné omezení.
Testováním jsem se dostal k následujícímu seznamu kódování, které jsou podporovány PG, ale nikde není zmínka, že by byly podporovány Windows:
- UTF8
- EUC_CN
- EUC_TW
- LATIN6 (ISO 8859-10/ECMA 144)
- LATIN7 (ISO 8859-13)
- LATIN8 (ISO-8859-14)
- LATIN10 (ISO 8859-16/ASRO SR 14111).