Os bancos de dados PostgreSQL possuem um tipo de caractere nativo, a "codificação do servidor". Geralmente é utf-8.
Todo o texto está nesta codificação. Texto de codificação misto não é suportado, exceto se armazenado como
bytea
(ou seja, como sequências de bytes opacas). Você não pode armazenar strings "unicode" ou "não-unicode", e o PostgreSQL não tem o conceito de "varchar" vs "nvarchar". Com utf-8, os caracteres que se enquadram no intervalo ASCII de 7 bits (e alguns outros) são armazenados como um único byte, e caracteres mais amplos exigem mais armazenamento, por isso é automático. utf-8 requer mais armazenamento do que ucs-2 ou utf-16 para texto com caracteres "largos", mas menos para texto que é uma mistura.
O PostgreSQL converte automaticamente de/para a codificação de texto do cliente, usando o
client_encoding
contexto. Não há necessidade de converter explicitamente. Se o seu cliente for "Unicode" (que os produtos da Microsoft costumam dizer quando significam UCS-2 ou UTF-16), a maioria dos drivers de cliente cuida de qualquer conversão utf-8 <--> utf-16 para você.
Portanto, você não precisa se preocupar, desde que seu cliente faça I/O com opções de charset corretas e defina uma
client_encoding
correta que corresponda aos dados que ele realmente envia no fio. (Isso é automático com a maioria dos drivers cliente como PgJDBC, nPgSQL ou o driver Unicode psqlODBC). Ver: