DevMedia

Problemas com Charset

0
Ola, to aqui dinovo rsrs,bem meu problema e que fiz uma plicasão que gera um arquivo de script para ser executado no banco,a aplicação esta gerando o arquivo mt bem.mas na hora de rodar o arquivo as tabelas ou campos que tenham acentos. da erro pq os aceitos são substituidos por caracteres não imprimeveis.O mas estranho e se eu copiar a e colar a linha no sql plus ela roda sem problemas. o Erro so acontese no sqlplus quando uso @arquivo.sql.

As minhas configuraçõs estão corretas com o formato europeu como podem ver abaixo.O oracle e o 10g

mt obrigado.


PARAMETER VALUE
---------------------------------------------------------------- -----------------------------------
NLS_LANGUAGE AMERICAN
NLS_TERRITORY AMERICA
NLS_CURRENCY $
NLS_ISO_CURRENCY AMERICA
NLS_NUMERIC_CHARACTERS .,
NLS_CALENDAR GREGORIAN
NLS_DATE_FORMAT DD-MON-RR
NLS_DATE_LANGUAGE AMERICAN
NLS_CHARACTERSET WE8MSWIN1252
NLS_SORT BINARY
NLS_TIME_FORMAT HH.MI.SSXFF AM

PARAMETER VALUE
---------------------------------------------------------------- -----------------------------------
NLS_TIMESTAMP_FORMAT DD-MON-RR HH.MI.SSXFF AM
NLS_TIME_TZ_FORMAT HH.MI.SSXFF AM TZR
NLS_TIMESTAMP_TZ_FORMAT DD-MON-RR HH.MI.SSXFF AM TZR
NLS_DUAL_CURRENCY $
NLS_NCHAR_CHARACTERSET AL16UTF16
NLS_COMP BINARY
NLS_LENGTH_SEMANTICS BYTE
NLS_NCHAR_CONV_EXCP FALSE

19 rows selected.


Respostas (6)

0
Rogério,

nao sei o tipo de aquivo que sua aplicação está gerando. Sugiro que vc olhe o caracter set do seu sistema operacional e de sua aplicação.

Seu banco me parece que está rodando em cima do windows já que o CHARACTER SET é WE8MSWIN1252.

Sua aplicação pode esta rodando em linux com outro CHARACTER SET e caso tenha uma camada entre o servidor e a aplicação como um Aplication Server, pode acontecer do arquivo ser gerado com o valor do Aplication.

Atenção: Não se pode alterar o CHARACTER SET do banco sem fazer antes um export full e depois um import full ou um backup.

Pra Finaizar, caso estja genrando um arquivo de web, olhe o valor da variável ENCODE.

Espero ter ajudado.


0
Obrigado pela ajuda,vou tentar dar mas detalhes que eu ate mesmo do problema que pra mim ja esta mais claro.

Eu estou usando vb.net pra criar um arquivo texto comum, do tipo notepad pra gerar os scripts, e a plataforma usa o padrão utf8, e ai que esta o problema pq, a plataforma pelo menos ate onde eu ainda sei, so trabalha com utf7,utf8 e encode. Por isto quando a gente le noonotepad o arquivo ele esta certo.mas quando o oracle interpleta não por interpletar de forma diferente.O cliente e Windows2000 tb, inclusive isto tb ocorre na minha maquina de desenvovimento onde eu sou o servidor.Estou pensando em usar alter session nsl_lang, sera que resolve ???? ainda não achei os parametros corretos para utf8.


0
Rogério,

UTF8 é Multibytes, ou seja, pra cada caracter são 2 ou 3 bytes. O Oracle trata isso da seguinte forma:

Pra CHARACTER SET Multibytes, ultiliza-se o NATIONAL CHACTER pra os campos NVARCHAR, NCHAR etc. setado no oracle pelo variável NLS_NCHAR_CHARACTERSET.

Como sua aplicação está rodando em UTF8 sugiro q vc utilize campos NVARCHAR, NCHAR etc. ou altere do CHARACTER SET de sua aplicação para
WE8MSWIN1252 ou WE8ISO8859P1(WE8ISO8859-15)


Espero ter ajudado.


0
vlw to enchando a sua paciencia rsrs.Mas o meu problema não são os dados,o aplicativo e para gerar scripts administrativos.Create table, create user , drop user, etc....,Quando rodo no sqlplus fuciona td mt bem,ate dar de cara com uma tabela que tenha acento no nome.(O cara que modelou isto merecia uma surra rsrs).

A rotina esta certa. tanto que na aplicação que eu fiz vc pode manter diretamente para o banco, quando se faz isto fuciona sem problemas, pq o oledb.net do oracle trata isto.O problema e quando o arquivo texto e criado, pq ele e criado com o padrão utf8, pq e o padrão que a microsoft limitou a plataforma por questões de segurança.pq tem alguns truques que se aproveitam da variedade de tipos de codepage.E se eu não conseguir resolver via banco eu vou ter que apelar pro velho C. e criar uma dll. Por isto queria realmente fazer o banco ver a codificação utf8, pq e a unica disponivel com acentos. Na plataforma.


0
Rogério,

entendi agora. Pelo que você mencionou, a aplicação gera o arquivo em UTF8, sendo que o banco e o S.O. está em WE8MSWIN1252.

Unico jeito que vejo, seria vc mudar o codeset na criação do arquivo texto, ou seja, na aplicação que gera o arquivo ou utilizar o C como vc mencionou, pois trata-se de acentuação em nome de objeto.

Você poderia também fazer um spool dentro do banco utilizando o pacote DBMS_METADATA pra gerar os metadados dos objetos, com isso você não teria problema de acentuação já que o Oracle e o S.O têm o mesmo CHARACTER SET.

Na parte de C eu nao conheço e nao poderia te auxiliar.




Abraço.


0
Renato.

Mt Obrigado pela paciencia,eu realmente não queria mas se não tem outro geito vou apelar pro codigo não gerenciado mesmo.O pacote não me server pq a aplicação e justamente para criar e gerenciar os objetos do banco,portanto eu não posso usar o dicionario de objetos pq poderia cair em situações que eles não existicem ainda.Mas de qualquer forma obrigado novamente. E no que puder ajudar estamos as ordens.