Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

jr.rodrigues

(PHP + SQL Server) Problema de acentuação

Recommended Posts

Sou novo no fórum e estou com um problema q ta me deixando louco aqui... vou tentar relatar tudo para facilitar alguma dica de vocês para solucionar meu problema...

 

Estou trabalhando hoje num sistema que está em PHP com MySQL (uma máquina para os arquivos e outra independente pro BD).

Tenho que migrar todo o banco de dados para uma outra máquina usando SQL Server 2005, os scripts em PHP continuaram onde estão.

 

Criei no SQL Server uma tabela chamada TAB_CIDADE com a mesma estrutura da usada no MySQL:

ID INT

CIDADE VARCHAR(50)

 

Extrai do MySQL um arquivo TXT e importei via gerenciador do SQL... o arquivo continha por exemplo:

 

INSERT tab_cidade (id,cidade) VALUES ('1','São Paulo');

INSERT tab_cidade (id,cidade) VALUES ('2','São José dos Campos');

INSERT tab_cidade (id,cidade) VALUES ('3','Sao Paulo');

INSERT tab_cidade (id,cidade) VALUES ('4','Sao Jose dos Campos');

 

Fiz um SELECT no próprio gerenciador e as informações estavam fiéis ou seja foi gravado o registro com a acentuação...

 

Criei então um script PHP conforme abaixo e acessei ele com o navegador, note que ele executa os mesmos inserts ou seja dupliquei os registros:

 

<?php

$res = mssql_query("INSERT tab_cidade (id,cidade) VALUES ('5','São Paulo')");

$res = mssql_query("INSERT tab_cidade (id,cidade) VALUES ('6','São José dos Campos')");

$res = mssql_query("INSERT tab_cidade (id,cidade) VALUES ('7','Sao Paulo')");

$res = mssql_query("INSERT tab_cidade (id,cidade) VALUES ('8','Sao Jose dos Campos')");

$res = mssql_query("SELECT * FROM tab_cidade") or die("Query failed");

?>

<HTML>

<HEAD>

<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">

<TITLE></TITLE>

</HEAD>

<BODY>

<?php

for ($i=0;$i<mssql_num_rows($res);$i++) { echo mssql_result($res,$i,'id')." - ".mssql_result($res,$i,'cidade')."<br>"; }

?>

</BODY>

</HTML>

 

No browser apareceu a seguinte informação:

 

1 - SÆo Paulo

2 - SÆo Jos‚ dos Campos

3 - Sao Paulo

4 - Sao Jose dos Campos

5 - São Paulo

6 - São José dos Campos

7 - Sao Paulo

8 - Sao Jose dos Campos

 

Notem que os dois primeiros registros que foram inseridos via gerenciador do SQL estão com problema na acentuação, já os inseridos via script PHP estão corretos.

 

Executei um SELECT no gerenciador do SQL para ver como foi gravada a informação no banco e verifiquei o seguinte:

 

id cidade

1 São Paulo

2 São José dos Campos

3 Sao Paulo

4 Sao Jose dos Campos

3 SÒo Paulo

4 SÒo JosÚ dos Campos

5 Sao Paulo

6 Sao Jose dos Campos

 

Percebi que os dados estão sendo gravados com Collation ou Character Set diferentes nos dois casos... as configurações dos dois bancos são as seguintes:

 

MySQL: a tabela está com "latin1_general_ci'

SQL Server: a tabela está com "SQL_Latin1_General_CP850_CI_AI"

 

O mesmo procedimento acima no MySQL não apresenta esse problema os dados são gravados sem a substituição do acento...

 

Eu posso ao inves de executar via gerenciador do SQL fazer o php abrir esses arquivos TXT que vieram do MySQL e executar, dessa maneira gravaria os dados no novo padrão que está no SQL Server... porém ai veio mais um problema hehehe...

 

Qdo executo um outro script PHP para dar um SELECT conforme as condições abaixo veja o que acontece:

 

O resultado de SELECT * FROM tab_cidade WHERE cidade LIKE '%são%' é:

5 - São Paulo

6 - São José dos Campos

 

O resultado de SELECT * FROM tab_cidade WHERE cidade LIKE '%sao%' é:

1 - SÆo Paulo

2 - SÆo Jos‚ dos Campos

3 - Sao Paulo

4 - Sao Jose dos Campos

7 - Sao Paulo

8 - Sao Jose dos Campos

 

Notém que quando busco com o acento ele retorna apenas 2 registros que foram inseridos via scripts PHP usando acento os outros dois que foram inseridos sem o acento são ignorados.

 

Já quando busco sem o acento ele retorna 6 registros sendo todos os inseridos via gerenciador e também 2 inseridos pelo script porém ignora os outros 2.

 

Como existiram buscas no site tanto com ou sem acento o ideal nesse caso seria que a busca retornasse os ID's 5, 6, 7 e 8 que foram os inseridos via script PHP ou seja independente do acento ele reconheceria. Estou já contando que irei fazer a migração do banco executando um php parar ler os arquivos .txt vindos do MySql conforme mencionei acima ou seja os dados serão gravados de acordo com o collation e Charset do SQL Server.

 

Desculpem ter escrito esse texto tão grande... aguardo um retorno e um ajuda..

Compartilhar este post


Link para o post
Compartilhar em outros sites

Texto grande... imagina hauahauaa

entao vamos por partes:

 

http://www.imasters.com.br/forum/lofiversi...hp/t247724.html

vai lhe ajudar, outra coisa:

 

Na instalacao tem uma area de collation settings

Por padrão o SQL Express é instalado como case-insensitive, accent-sensitive. Ou seja, não faz restrição a maiúsculas e minúsculas, mas faz restrição a acentuação. Com isso, durante uma pesquisa, "João" e "joão" são a mesma coisa mas "João" e "Joao" ou "joão" e "joao" NÃO são. Para evitar futuros problemas com acentuação ou caracteres maiúsculos e minúsculos, recomendo que você selecione o Collate Latin_General_CI_AS. A não ser é claro, que você precise manter a compatibilidde de collate com outos servidores. Neste caso, selecione seu collate conforme o collate das versões anteriores.

 

Abs

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu procuro deixar o collations de todas as databases no sql server em Latin_General_CI_AI. Já reclamei com a Locaweb e num sei porque eles criam as databases com esse collation que é incompatível com o php.

 

O Latin_General_CI_AI é totalmente compatível tanto com o php quanto ao ASP ou ASP.NET.

 

Porém as tabelas que já foram criadas dentro do collation anterior, você precisa recriá-las depois de trocar o collation da database para que os novos registros sejam gravados já no novo formato.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu procuro deixar o collations de todas as databases no sql server em Latin_General_CI_AI. Já reclamei com a Locaweb e num sei porque eles criam as databases com esse collation que é incompatível com o php.

 

O Latin_General_CI_AI é totalmente compatível tanto com o php quanto ao ASP ou ASP.NET.

 

Porém as tabelas que já foram criadas dentro do collation anterior, você precisa recriá-las depois de trocar o collation da database para que os novos registros sejam gravados já no novo formato.

Dei um DROP na tabela e recriei ela com esse novo Collation sugerido... porem o problema permaneceu... o SELECT não considera que São e Sao são a mesma coisa... retorna sempre ou com acento ou sem... e agora está retornando o com acento de maneira errada...

 

Busca por: São

5 - SÒo Paulo (PHP)

6 - SÒo JosÚ dos Campos (PHP)

 

Busca por: Sao

7 - Sao Paulo (PHP)

8 - Sao Jose dos Campos (PHP)

 

Testei com Latin1_General_CI_AI e Latin1_General_CI_AS

Compartilhar este post


Link para o post
Compartilhar em outros sites

Texto grande... imagina hauahauaa

entao vamos por partes:

 

http://www.imasters.com.br/forum/lofiversi...hp/t247724.html

vai lhe ajudar, outra coisa:

 

Na instalacao tem uma area de collation settings

Por padrão o SQL Express é instalado como case-insensitive, accent-sensitive. Ou seja, não faz restrição a maiúsculas e minúsculas, mas faz restrição a acentuação. Com isso, durante uma pesquisa, "João" e "joão" são a mesma coisa mas "João" e "Joao" ou "joão" e "joao" NÃO são. Para evitar futuros problemas com acentuação ou caracteres maiúsculos e minúsculos, recomendo que você selecione o Collate Latin_General_CI_AS. A não ser é claro, que você precise manter a compatibilidde de collate com outos servidores. Neste caso, selecione seu collate conforme o collate das versões anteriores.

 

Abs

jus2ka,

 

Verifiquei o link que você passou porém o problema persiste.. :(

Esotu usando um collation para accent-insensitive mas mesmo assim o select não retornar os registros "João" e "Joao"

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.