O MySQL Table contém latin1 mas é definido como UTF8, character encoding hell

1

Eu 'herdei' uma configuração do osCommerce 2.2, PHP4 e MySQL4 que causa problemas. O problema é a codificação de caracteres. Embora as tabelas estejam definidas para conter UTF8 , elas realmente contêm latin1 . Para misturar algo completamente novo nisso, parece que o codificador antigo alterou isso manualmente, configurando SET CHARACTER SET 'utf8' quando a conexão com o banco de dados é feita.

Agora parece com isso:

  • MySQL: UTF8 mas na verdade contém latin1 .
  • PHP: O MySQL-Connection é configurado manualmente para UTF8 .
  • HTML: é entregue como ISO-8859-1 aka latin1

Esta configuração funcionou até uma semana atrás, quando o provedor mudou algo (eles realmente negaram tocar o banco de dados ou qualquer outra coisa, mas tiveram problemas com o servidor).

A parte problemática é que os caracteres especiais alemães öäüß são exibidos corretamente, mas no momento em que você deseja inseri-los no banco de dados, todas as sessões do osCOmmerce são interrompidas e apenas o texto até que o caractere seja inserido.

  • Texto a inserir: Das _ä_ ist ein Umlaut
  • Texto que é salvo: Das _

No momento em que altero a intrusão manual, definindo o conjunto de caracteres como latin1 quando a conexão é estabelecida, todas as inserções são adequadas, mas o banco de dados está entregando apenas ? em vez dos caracteres especiais.

Eu não tenho idéia de como resolver isso, se eu alterar as colunas do banco de dados para latin1 eu perco todos os caracteres especiais, se eu mudar a codificação na conexão a exibição ou inserção falha. Estou completamente sem ideias.

    
por Bobby 22.10.2011 / 22:12

2 respostas

1

Quando você está alterando dados que estão em outro conjunto de caracteres, primeiro é necessário alterá-lo para blob e, em seguida, para o conjunto de caracteres de destino (latin1). Se você não fizer o mysql fará a conversão para você e você não o fará, já que você já possui os dados em latin1?

AFAIK quando você usa set chatacter definido em uma conexão (isto é, php) o mysql converte automaticamente todos os dados na tabela para o conjunto de caracteres da conexão.

    
por 22.10.2011 / 23:06
2

Solução não elegante, mas geralmente funcional:

  1. despejar o banco de dados inteiro para o arquivo SQL - verifique se você possui a codificação correta no arquivo de texto,
  2. corrigir consultas para tabelas, para criar tabela UTF-8
  3. verifique as configurações do seu banco de dados - use UTF-8
  4. importar o banco de dados inteiro novamente
por 23.10.2011 / 13:22