segunda-feira, 14 de dezembro de 2009

Fazer select em coluna com acento no PHP/Mysql

Eu sei que isso parece absurdo - e de fato é! -, mas por incrível que pareça ocorreu hoje comigo!
Tive que realizar uma interface com um sistema externo, e para isso foi disponibilizada uma view no Mysql com os dados necessários.
E qual não foi minha surpresa ao ver que a "criatura" criou uma view em que duas colunas estavam com acentuação!?
Padrão SQL ANSI para que, não é mesmo!?

Para piorar, a burocracia aliada à falta de vontade dele era tão grande que ia acabar demorando mais umas duas semanas para que tudo fosse corrigido. Então, lá vou eu achar uma solução para esta c.. coisa!

Inicialmente tentei converter tudo para UTF8, utilizando as funções utf8_encode() para "encodar" a string de SQL e a mysql_set_charset() para os encodings do cliente e do servidor mysql também serem UTF8. Porém, nada feito, o erro persistia...

Foi então que conheci uma função que resolveu o problema: mysql_field_name(). Esta função retorna os nomes de todas as colunas de uma SELECT já no encoding correto!
E então, depois de umas 2 horas quebrando a cabeça, saiu este Frankstein:
<?php

# imagine uma tabela que tenha um campo chamado "informação"

mysql_connect('localhost', 'root', '');
mysql_select_db('teste');

# Fazemos um select trazendo somente uma linha, para poder pegar o nome de todas as colunas
$h = mysql_query('SELECT * FROM teste LIMIT 1');

# Aqui pegamos o nome da coluna acentuada, já no encoding correto
$coluna = mysql_field_name($h, 0);

# E então a usamos para criar uma query pegando os valores dela, note que somos obrigados a usar o acento grave -
# também conhecido (de forma errada) como crase(`) - para cercar o nome da coluna, porque senão o mysql continua a dar erro
$h = mysql_query('SELECT `'.$coluna.'` as informacao FROM teste') or die(mysql_error());

# Pronto, finalmente ele retorna a query com sucesso!
print_r( mysql_fetch_assoc($h));