2.6 Proč nemohu vybrat Unicode jako kódování

Z PostgreSQL
Verze z 1. 11. 2007, 16:05, kterou vytvořil 88.102.151.115 (diskuse)
(rozdíl) ← Starší verze | zobrazit aktuální verzi (rozdíl) | Novější verze → (rozdíl)
Skočit na navigaci Skočit na vyhledává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).