Bazy danych PostgreSQL mają natywny typ znaków, "kodowanie serwera". Zwykle jest to UTF-8.
Cały tekst jest w tym kodowaniu. Mieszane kodowanie tekstu nie jest obsługiwane, chyba że jest przechowywane jako bytea
(tj. jako nieprzezroczyste sekwencje bajtów).
Nie można przechowywać ciągów „unicode” lub „non-unicode”, a PostgreSQL nie ma pojęcia „varchar” vs „nvarchar”. W przypadku utf-8 znaki mieszczące się w 7-bitowym zakresie ASCII (i kilka innych) są przechowywane jako pojedynczy bajt, a szersze znaki wymagają więcej pamięci, więc jest to po prostu automatyczne. Utf-8 wymaga więcej miejsca niż ucs-2 lub utf-16 dla tekstu, który składa się wyłącznie ze znaków „szerokich”, ale mniej dla tekstu, który jest mieszanką.
PostgreSQL automatycznie konwertuje do/z kodowania tekstu klienta, używając client_encoding
ustawienie. Nie ma potrzeby jawnej konwersji.
Jeśli Twoim klientem jest „Unicode” (co produkty firmy Microsoft zwykle mówią, gdy mają na myśli UCS-2 lub UTF-16), to większość sterowników klienta zajmuje się każdą konwersją utf-8 <--> utf-16.
Więc nie powinieneś się tym przejmować, o ile twój klient wykonuje I/O z poprawnymi opcjami zestawu znaków i ustawia poprawne client_encoding
który pasuje do danych, które faktycznie wysyła przez przewód. (Jest to automatyczne w przypadku większości sterowników klienckich, takich jak PgJDBC, nPgSQL lub sterownik Unicode psqlODBC).
Zobacz: