Diogo Besson :: tecnologia

Problema de acentuação em Oracle + PHP

Problema de acentuação em Oracle + PHP

Problema de acentuação em Oracle + PHP é sempre um problema. Principalmente quando se trabalha com caracteres latinos, acentos, cedilha… E nos bancos da dados da Oracle, como tratar?

oracle + php

calma, não arranque os cabelos (ainda)

Uma leitora amiga estava vivenciando problemas de acentuação ao utilizar PHP com bancos Oracle. Pela reclamação dela, ao utilizar caracteres latinos em updates e inserts, os mesmos eram substituídos por “?”.

O que acontece?

Não tenho experiência alguma em Oracle para dizer com certeza o que estaria rolando nesse caso, mas recebi umas dicas dela que podem ser úteis na análise desse problema.

Quando o servidor de testes, desenvolvimento, homologação (e etc) tem uma configuração definindo a língua default para português do Brasil e você tem um servidor de produção rodando em inglês da América, é necessário dizer para o PHP:

1- que você está utilizando uma língua latina e;

2- você quer que o servidor onde seu script roda possa entender as informações que dele vierem.

Muita coisa pode ser testada, como utf8_encode e utf8_decode. Coisa que já discutimos exaustivamente nos posts sobre mPDF, correto?

Acontece que, efetivamente, a nível de servidor rodando Oracle (vixe!!!), só uma coisa resolve: Enfiar uma variável de ambiente NA UNHA.

Pra isso, insira no seu script de conexão ao banco a seguinte linha:

putenv("NLS_LANG=PORTUGUESE_BRAZIL.WE8ISO8859P1") or die("Falha ao inserir a variavel de ambiente");

Sem entrar em muitos detalhes, essa função putenv($variavel), adiciona uma variavel no ambiente do servidor. Como tudo que roda sem persistência no script, essa variável de ambiente irá existir somente enquanto durar a requisição atual e, no final, será destruída, voltando assim o ambiente ao seu estado natural.

Lembrando que nem todo servidor deixa você definir a variável de ambiente que quiser, pois isso gera uma brecha de segurança monstruosa. Por padrão, somente as variáveis começado por “PHP_ ” podem ser definidas em tempo de execução. Caso você caia numa situação mais proibitiva, dê uma lida na diretiva safe_mode_allowed_env_vars e ensine o admin do teu servidor a permitir somente essa variavel (“NLS_”) pra fazer o script cantar mais bonito.

Eu agradeço à nossa amiga (que não quis se identificar) pela dica e espero aprender mais coisas interessantes sobre o Oracle com PHP em oportunidades futuras!

Como dica de estudo, eu também recomendo:

PHP PDO -> http://www.php.net/manual/pt_BR/book.pdo.php

PDO OCI -> http://php.net/manual/pt_BR/ref.pdo-oci.php

ORACLE OCI -> http://php.net/manual/en/book.oci8.php

LISTA PHP ESPECIALISTAS -> http://br.groups.yahoo.com/group/php-especialistas/message/18166

BLOG DO THUNDER-BOY -> http://jf.eti.br/howto-corrigindo-charset-laop-linuxapacheoraclephp/

HEXBLOT (En) -> http://www.hexblot.com/blog/making-php-play-nice-oracle-part-1

um abraço!

5 Comments

  1. Sagati

    Muito bom !!!!

    Obrigado

  2. claudio

    Muito bom! Migrei um sistema que estava usando MySQL para Oracle, e este foi o primeiro problema que eu encontrei. Perdi muito tempo tentando resolvê-lo e garça a esta função função putenv() que inseri na função e conecta BD Oracle resolveu o meu problema. Parabéns.

  3. Diogo Besson (Post author)

    Show, Claudio! Obrigado pelo retorno.
    abraço.

  4. Francisco Freitas

    Boa tarde, no meu sistema funcionou, porem depois de algum tempo ele deixa de funcionar novamente, ai eu reinicio o apache e ele volta a funcionar por um tempo, alguma ideia do que possa ser?

  5. Diogo Besson (Post author)

    algo que é executado posteriormente está alterando essa variável de ambiente? pode ser, hem…

Leave a Comment

O seu endereço de e-mail não será publicado.