Quando você diz que roda no servidor, quer dizer através do SQL*Plus?
A primeira coisa a verificar é qual caractere real está sendo armazenado - use a função DUMP para verificar isso:
Função de despejo do Oracle
Isso lhe dirá o que está realmente armazenado. Se a cadeia entre seu aplicativo cliente e o servidor Oracle não for apropriada, você poderá obter a conversão do conjunto de caracteres.
Assumindo que o caractere correto está sendo salvo, o que você vê no servidor / sqlplus é a conversão de caracteres em exibição. Ou seja O Oracle está "servindo" o caractere corretamente, mas a tela não está lidando com ele como você espera. Para corrigir isso, você precisa definir a variável de ambiente NLS_LANG para o conjunto de caracteres correto.
por exemplo, em um projeto recente o padrão:
set NLS_LANG=AMERICAN_AMERICA.US7ASCII
em seguida, consulte alguns dados fornecidos:
NAME
-----------------------------------
MS ELLIE MARTALL
Mas:
set NLS_LANG=AMERICAN_AMERICA.US8PC437
Em seguida, executando a consulta deu:
NAME
-----------------------------------
MS ÉLLIE MARTALL
E também:
set NLS_LANG=AMERICAN_AMERICA.WE8ISO8859P15
deu:
NAME
-----------------------------------
MS ╔LLIE MARTALL
A principal coisa aqui é que os dados reais são os mesmos, é a maneira como os dados estão sendo apresentados em sua tela é o que difere, e esse comportamento pode ser controlado por NLS_LANG.