Ao converter um banco de dados para UTF-8, notei um comportamento estranho em relação aos caracteres de controle 0x80-0x9F. Por exemplo, 0x92 (apóstrofe à direita) não seria convertido em UTF-8 e truncaria o restante do conteúdo de uma coluna, usando este método:
CREATE TABLE `bar` (
`content` text
) ENGINE=MyISAM DEFAULT CHARSET=latin1
INSERT INTO bar VALUES (0x8081828384858687898A8B8C8D8E8F909192939495969798999A9B9C9D9E9F);
Query OK, 1 row affected (0.06 sec)
SELECT content FROM bar;
+---------------------------------------------------------------------------------+
| content |
+---------------------------------------------------------------------------------+
| €‚ƒ„…†‡‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ |
+---------------------------------------------------------------------------------+
1 row in set (0.06 sec)
ALTER TABLE bar CHANGE content content TEXT CHARACTER SET UTF8;
Query OK, 1 row affected, 1 warning (0.06 sec)
Records: 1 Duplicates: 0 Warnings: 1
SHOW WARNINGS;
+---------+------+-------------------------------------------------------------------------------------+
| Level | Code | Message |
+---------+------+-------------------------------------------------------------------------------------+
| Warning | 1366 | Incorrect string value: '\x80\x81\x82\x83\x84\x85...' for column 'content' at row 1 |
+---------+------+-------------------------------------------------------------------------------------+
1 row in set (0.06 sec)
SELECT * FROM bar;
+---------+
| content |
+---------+
| |
+---------+
1 row in set (0.06 sec)
Embora normalmente 0x80-0x9F não seja permitido no Latin1, o MySQL parece lidar com isso de maneira diferente:
O latin1 do MySQL é o mesmo que o conjunto de caracteres cp1252 do Windows. Isso significa que é o mesmo que o oficial ISO 8859-1 ou IANA (Internet Assigned Numbers Authority) latin1, exceto que IANA latin1 trata os pontos de código entre 0x80 e 0x9f como “indefinidos”, enquanto cp1252 e, portanto, o latin1 do MySQL, atribui caracteres para essas posições. [origem]
Mas o MySQL não consegue converter o intervalo de valores acima de seu conjunto de caracteres latin1 para seu conjunto de caracteres UTF-8.
Esses caracteres estão entrando em meu banco de dados copiando/colando de um documento do Word (cp1252) e, embora eu possa ter encontrado uma maneira de fazer com que o aplicativo force os valores UTF-8 corretos para novas entradas, preciso garantir que o antigo obtenha convertido corretamente.
Existe uma maneira dentro do MySQL que estou perdendo para convertê-los para o equivalente UTF-8 sem passar por cada linha de cada coluna de texto e substituí-los por uma versão compatível com ASCII?
Não tenho certeza. Tentei começar reproduzindo seu problema, mas o alter funcionou bem para mim.
Aqui estão minhas configurações de char relacionadas
Editar
Minhas configurações de char antes de rodar set names utf8
Versão
Você pode ter que converter o conjunto de caracteres para cp1250 antes de carregar os dados.
Eu corri isso primeiro
cp1252 não existe aqui. O mais próximo é cp1250.
Tente esta sequência:
e veja o que acontece.
Eu tenho isso no MySQL 5.5.19 no Linux
e eu tenho isso no MySQL 5.5.12 para Windows na minha máquina com Windows 7
De uma chance !!!