O sinal numérico ,
º
, é 0xBA em ISO-8869-1
não UTF-8. Portanto, seu arquivo CSV está codificado com Latin-1, mas você está tentando armazená-lo em seu banco de dados como UTF-8 sem corrigir a codificação. Você pode tentar dizer à sua biblioteca CSV que ela está lidando com texto codificado em Latin-1 e talvez ela cuide da conversão para UTF-8. Se isso não funcionar, você pode fazer isso sozinho com Iconv :
ruby-1.9.2 > Iconv.iconv('UTF-8', 'ISO-8859-1', "\xba")
=> ["º"]
ruby-1.9.2 > Iconv.iconv('UTF-8', 'ISO-8859-1', "\xb0")
=> ["°"]
Você não está tendo problemas com o SQLite porque o SQLite tende a ser muito tolerante e tem um sistema de tipos muito flexível. O PostgreSQL, OTOH, tende a ser bastante rigoroso e reclama adequadamente se você tentar alimentá-lo com dados inválidos. Eu recomendo que você pare de desenvolver em cima do SQLite se você for implantar no Heroku e no PostgreSQL, existem outras diferenças que causarão problemas (o comportamento de GROUP BY e LIKE por exemplo).