SQL Server 2005 Collate vs PHP

Então pessoal, dessa vez foi realmente foda.
NUNCA fiquei tanto tempo sem postar aqui, e tipo, não devia ter feito isso. Seriously.

Tirei férias, peguei freela, quebrei o dedo mindinho da mão esquerda, aprendi a mexer com ‘opensocial’, aprendi a mexer com muita coisa, comprei um Motorola Milestone (com Android!! Daqui a pouco, posts sobre Android aqui pra vocês!!), troquei de emprego, troquei de emprego de novo.

Enfim, no meu novo emprego, na Plan B, passei por um probleminha não muito comum (eu acho), lidar com PHP buscando dados de uma base em SQL Server 2005.

Eu estava trabalhando num arquivo cuja codificação era UTF-8. Na hora de exibir os dados vindos do banco, dava erro na codificaão, exibindo aquele caractere com uma ‘?’ dentro de um losango (acho que todo developer conhece esse símbolo!! hahaha..).
Fui tentando as opções de praxe:

<?php
    echo utf8_encode($bd->nome);
    echo utf8_decode($bd->nome);
    echo utf8_encode(htmlentities($bd->nome));
    echo htmlentities(utf8_encode($bd->nome));
    echo utf8_decode(htmlentities($bd->nome));
    echo htmlentities(utf8_decode($bd->nome));
?>

Acontece que a collation padrão do SQL Server é SQL_Latin1_General_CP1_CI_AS. E isso eu só descobri depois.
Qual foi então a minha solução?! Depois de umas belas pesquisadas e uma grande ajuda do Leandro Rodrigues, conseguimos foi na query de busca dos dados, fazermos um CAST no campo e definimos a collation dele ali mesmo, dessa maneira:

SELECT CAST({campo} AS {tipo}) COLLATE {collation} AS {alias}
FROM {tabela}'

Então, o caso foi colocar a collation ‘Latin1_General_BIN’, ficando assim:

SELECT CAST(nome AS nvarchar(255)) COLLATE Latin1_General_BIN AS nome
FROM usuarios'

E depois, colocar no PHP a função ‘uft8_encode();’ na hora de exibir os dados.

<?php
    echo utf8_encode($bd->nome);
?>

Pra quem nunca mexeu com SQL Server e achar estranho, eu digo SIM, existe um tipo de dado chamado ‘nvarchar’, com esse ‘N’ na frente mesmo. ;D

Então é isso, a solução foi essa e funcionou perfeitamente.

Um grande abraço, pessoal!!

Leave a Reply