C'est juste un petit post-it pour moi, mais ça pourrait aussi vous être utile. J'ai trouvé ce message en lisant pgsql-general.

Voici un exemple de son utilisation sur une base créée spécialement pour :

 guillaume@laptop:~$ psql base1
 Bienvenue dans psql 8.2.13, l'interface interactive de PostgreSQL.
 
 Saisissez:
     \copyright pour les termes de distribution
     \h pour l'aide-mémoire des commandes SQL
     \? pour l'aide-mémoire des commandes psql
     \g ou point-virgule en fin d'instruction pour exécuter la requête
     \q pour quitter
 
 guillaume@base1=# \d
                Liste des relations
  Schéma | Nom | Type | Propriétaire
  - - - -+ - - + - - -+ - - - - - - -
  public | t1 | table | guillaume
  public | t1_id_seq | séquence | guillaume
 (2 lignes)
 
 guillaume@base1=# select * from db_utf8_verify();
 NOTICE: Checking table t1, field contenu
 NOTICE: Checking table t1, field contenu
  tab | fld | location
  - - + - - + - - - - -
  t1 | contenu | (0,1)
  t1 | contenu | (0,5)
 (2 lignes)
 
 guillaume@base1=# select * from t1;
  id | contenu
  - -+ - - - - - - - - - - - - - -
   1 | phrase en UTF -8 (���ui��)
   2 | phrase en UTF -8 (àéèuiöî)
   3 | totoéàù
   4 | toto
   3 | t �
 (5 lignes)
 
 guillaume@base1=# select * from t1 where ctid in ('(0,1)', '(0,5)');
  id | contenu
  - -+ - - - - - - - - - - - - - -
   1 | phrase en UTF -8 (���ui��)
   3 | t �
 (2 lignes)

À mon avis, son seul côté négatif est sa lenteur. Traiter des chaînes avec PL/pgsql, c'est chercher les ennuis côté performances. Néanmoins, ce sera certainement plus rapide (et moins ennuyant) qu'un traitement manuel.

Ce serait cool d'avoir le même code en Python, Perl ou même carrément en C.