Migrando um banco de dados do Sql Server me deparei com o seguinte problema:

O banco dados não trouxe as quebras de linhas dos campos de texto, a minha solução foi conectar via Pdo com o banco de dados Sql Server e trazer as informações diretamente do banco para salva-las em Mysql.

Veja aqui como conectar com o Sql Server:

Ao apresentar os dados do Sql Server na tela apareceram os erros de codificação, descobri que o banco utilizava o charset SQL_Latin1_General_CP850_CI_AI agora e foi  necessário converter a codificação do Sql Server de CP850 para UTF-8.

Utilizei a função iconv para isso:

iconv(“CP850”, “UTF-8//TRANSLIT”, $val);

onde $val é a variável que contem o texto;

Caso a codificação do Sql Server seja Latin1_General_CI_AS (charset ISO-8859-1)  e você queira converter isso para UTF-8 basta usar:

iconv(“ISO-8859-1”, “UTF-8//TRANSLIT”, $val);

Mas o pior ainda estava por vir, descobri que o programador utilizou 2 codificações diferentes para campos distintos dentro da mesma tabela, depois de muito procurar desiste de encontrar uma função que identificasse qual o charset atual do texto para que eu pudesse alterar a codificação dinamicamente. Tentei a função mb_detect_encoding mas sem sucesso.

Se alguém conhecer ou descobrir uma outra forma de identificar o charset do texto e quiser postar nos comentários eu agradeço.

10 thoughts to “Converter codificação do SqlServer para o Mysql em PHP (charset CP850 do SqlServer para Mysql)

  • Eduardo HR

    Rapaz, salvou a vida aqui hoje ein.
    Estávamos tentando usar o utf8_decode / encode e nada.

    Esse comando resolve.
    Ainda temos uns errinhos em algumas outras variáveis, mas agora é ver qual a diferença.

    Faz anos que não sabemos o que é usar este tipo de comando pois com o Zend Framework nem temos esta preocupação.

    Valeu aí.

    Responder
  • Alexandre

    Salvou minha vida hoje também! rsrsrs…
    Banco de um jeito, sistema de outro… e a gente tem que se virar…

    Valeu!

    Responder
  • Fernando Bomfim

    Poxa, muito obrigado! Eu estou desenvolvendo um robô de captura de produtos automático em PHP, similar ao do Buscapé.
    O programador que desenvolveu a estrutura de Admin do sistema utilizou ASP.NET com SQL Server 2008 e codificação SQL_Latin1_General_CP850_CI_AI.
    Fiquei o dia inteiro procurando uma solução para codificar as strings sem precisar alternar o SQL Server ou as Tabelas. Agora encontrei!

    Agora também estou na procura da detecção automática da codificação, dando uma string como parâmetro.
    Também já tentei a função mb_detect_encoding(), porém, no meu caso, ela retorna “ASCII” ao invés de “CP850”.

    Abraço!

    Responder
  • Rodrigo Kulb

    Ola Rafael Theodoro,

    Vai toma no C*****, fiquei o dia inteiro procurando uma resposta e você matou em cheio meu problema, não sei se o google esta ficando velho mais esta cada vez mais difícil achar as respostas lá!!

    PARABÉNS!!

    Só para completar eu tive que adaptar.

    $var = utf8_decode(iconv(“CP850”, “UTF-8//TRANSLIT”, $var));

    falow!!!

    Responder
  • Henrique Palazzo

    Valeu bro! Salvou minha vida também. Algumas horas de pesquisa e nada. Valeu!

    Responder
  • Carlos Jacon

    Muito obrigado!!

    Responder
  • vitor

    Cara ,

    Salvou minha vida, muito obrigado..

    Abs

    Responder
  • André Morales

    Muito bom o post objetivo e direto ao ponto. Ajudou bastante.

    Obrigado.

    Responder
  • Flávio Ariano

    Você pode tentar assim:

    header(“Content-Type: text/html; charset=utf-8”);
    $dbhost = “hostname”;
    $db = “database”;
    $query = “SELECT *
    FROM Estado
    ORDER BY Nome”;
    $conn = new PDO( “sqlsrv:server=$dbhost ; Database = $db”, “”, “” );
    $stmt = $conn->prepare( $query, array(PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL, PDO::SQLSRV_ATTR_CURSOR_SCROLL_TYPE => PDO::SQLSRV_CURSOR_BUFFERED, PDO::SQLSRV_ENCODING_SYSTEM) );
    $stmt->execute();
    while ( $row = $stmt->fetch( PDO::FETCH_ASSOC ) )
    {
    // CP1252 == code page Latin1
    print iconv(“CP1252”, “ISO-8859-1”, “$row[Nome] “);
    }

    Responder
  • saulo

    Mano! salvou meu dia, sofri até achar sua solução.

    Grande abraço!

    Responder

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.