Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Olá todos do fórum!
Gostaria de pedir uma ajuda de um problema que estou tendo e não encontro solução.
Tenho uma consulta que realizo no banco sql server que funciona normalmente:
select
smpessoa_nome,
smcredenc_id,
smcredenc_idpesrec,
smpesjur_nome,
smcredenc_livreto
from
smpessoa,
spcredencvig,
smcredenc
left join
smpesjur
on
smpesjur_id = smcredenc_id
where
( smpessoa_nome like '%$txtPesquisa%' COLLATE SQL_Latin1_General_CP1_CI_AI
or smpesjur_nome like '%$txtPesquisa%' COLLATE SQL_Latin1_General_CP1_CI_AI
)
and smpessoa_id = smcredenc_id
and smcredenc_livreto = 'S'
and spcredencvig_idcredenc = smcredenc_id
and getdate() between spcredencvig_dtinicio and spcredencvig_dttermino
order by
smpessoa_nome
Os dados nessa tabela estão todos sem acentos. Então se eu pesquisar por exemplo: centro médico. Ele não acha nada porque essa
tabela está com collation SQL_Latin1_General_CP1_CI_AS para ignorar acentos. Então adicionei o COLLATE
SQL_Latin1_General_CP1_CI_AI que me trouxe os resultados que queria. Não posso mudar o collate direto na tabela porque tem um
sistema desktop que utiliza essa tabela e só funciona sem acentos.
Só que o problema agora é no php. Quando executo essa query no SQL Management Studio os resultados são trazidos normalmente,
mas ao rodar a query pelo php o resultado não é trazido, como se o php não reconhecesse o comando collate.
Estou usando a versão do php 5.3.28 e sql server 2005.
Agradeço desde já pela atenção
Já consegui resolver o problema da pesquisa no site que não estava buscando.
Retirei os acentos da palavra pelo próprio php, já que o collate no banco não funcionava na query.
Agora só fico em dúvida porque o collate não funciona dessa forma no php:
SELECT 'CENTRO MÉDICO' COLLATE sql_latin1_general_cp1251_cs_as as campo FROM tabela
Retornando o nome CENTRO MÉDICO com acentos se executado pelo mssql_query.
E no SQL Management Studio a mesma query retorna CENTRO MEDICO.
Teoricamente falando, não há necessidade em definir o collate no momento da consulta.
Outro quesito é o driver de conexão que você está utilizado. Ele pode ser responsável por aceitar, ou não, a definição da keyword COLLATE na query;
Seria indicado utilizar PDO ao invés das funções mssql_*.
Caso seu servidor seja Windows, baixe o driver SQLSRV que é o mais recomendado. Caso não seja possível, ODBC resolve facilmente o problema. Já em linux, tende a ser um problema quanto a isso, mas normalmente necessita baixar unixODBC e FreeTDS.
Faço os testes com a consulta sem o COLLATE na query e utilizando PDO. O driver deve ser capaz de adequar o banco para o PHP.
Olá Gabriel já fiz o teste aqui, o collate realmente funciona quando a query é executada com pdo
$rs = $pdo->query("SELECT 'CENTRO MÉDICO' COLLATE sql_latin1_general_cp1251_cs_as as texto");
foreach ($rs as $value) {
echo $value["texto"];
}
Fiz também o teste na primeira query que abriu esse tópico sem o collate, mas a busca não trouxe nada mesmo
usando o pdo. Por exemplo se no banco eu tiver a palavra CENTRO MEDICO gravada e no select eu buscar
CENTRO MÉDICO ele não traz resultados.
Mas quando adiciono o collate ele traz os resultados como queria. O problema agora será migrar todas as querys
com mssql_ para pdo rs.
abrass
Acabei de fazer um teste com php e notei que o collate funciona, mas com algumas restrições.
Por exemplo:
SELECT campo COLLATE sql_latin1_general_cp1251_cs_as FROM tabela
Se eu executar essa query com mssql_query os acentos que o "campo" tiver vão ser retirados.
Mas nesse outro caso não:
SELECT 'CENTRO MÉDICO' COLLATE sql_latin1_general_cp1251_cs_as as campo FROM tabela
Nesse caso ao passar uma string diretamente para o sql o collate não funciona e o resultado continua acentuado.