2012-05-09 21 views
5

En algún momento, entre todas las importaciones y exportaciones que he realizado, gran parte del texto de un blog que ejecuto está lleno de caracteres extraños A acentuados. Por ejemplo:Eliminando caracteres extraños de los datos de MySQL

http://teamsoell.com/andy/petnames (contenido de remachado, lo sé)

cuando la exportación de los datos usando mysqldump y cargarlo en un editor de texto con la intención de utilizar la búsqueda y reemplazo para limpiar los malos caracteres, la búsqueda solo coincide con cada carácter "a".

¿Alguien sabe de qué manera puedo cazar con éxito estos personajes y deshacerme de ellos, ya sea directamente en MySQL o usando mysqldump y luego reimportando el contenido?

+0

Debería usar un editor de texto que permita comparaciones binarias estrictas en los caracteres. Los usuarios conscientes de UTF-8 considerarán 'a' lo mismo que '' –

+0

¿Alguna recomendación? Preferiría una aplicación OS X, pero sí tengo acceso a una máquina con Windows 7 si es necesario. –

Respuesta

8

Este es un problema de codificación; el  es un espacio sin interrupciones (entidad HTML  ) en Unicode que se muestra en Latin1.

Se podría intentar algo como esto ... primero, comprobamos asegurarse de que el juego está funcionando:

SELECT * FROM some_table WHERE some_field LIKE BINARY '%Â%' 

Esto debería devolver ninguna fila en donde some_tablesome_field tiene un mal carácter. Suponiendo que funciona correctamente y que se encuentran las filas que está buscando, intente esto:

UPDATE some_table SET some_field = REPLACE(some_field, BINARY 'Â', '') 

Y eso debería quitar esos caracteres (basado en la página se ha vinculado, que realmente no quiere un nbsp allí, ya que terminaría con tres espacios seguidos entre oraciones, etc., solo debería tener uno).

Si no funciona, tendrá que observar la codificación y la intercalación que se está utilizando.

EDITAR: Acabo de agregar BINARY a las cuerdas; con suerte, esto debería hacer que funcione independientemente de la codificación.

+0

He intentado la primera consulta que sugiere, pero el caracter "Â" se elimina cuando lo pego en mi aplicación Terminal. Esto me ha dado una buena dirección para mirar, sin embargo. –

+0

Oh, eso lo hará más doloroso ... Suelo usar MySQL Workbench. Si puede ingresar al servidor de la base de datos, puede usar MySQL Workbench en un túnel SSH. –

+0

Ah, tengo Sequel Pro, y esa consulta funciona allí. Fantástico, muchas gracias por esto! Casi me había resignado a arreglar cientos de publicaciones a mano. –

0

He tenido este problema y es molesto, pero solucionable. Además de Â, puede encontrar una gran cantidad de caracteres que aparecen en sus datos como estos: â € œ Esto está conectado a los cambios de codificación en la base de datos, pero siempre que no tenga ninguno de estos caracteres en su base de datos que desea conservar (por ejemplo, si realmente está usando un símbolo de Euro), entonces puede quitarlos con unos pocos comandos de MySQL como se sugirió anteriormente.

En mi caso he tenido este problema con una base de datos de Wordpress que había heredado, y me encontré con un útil conjunto de consultas pre-formados que trabajan para Wordpress aquí http://digwp.com/2011/07/clean-up-weird-characters-in-database/

Es también digno de mención que una de las causas del problema en primer lugar es abrir una base de datos en un editor de texto que podría cambiar la codificación de alguna manera. Por lo tanto, si puede manipular la base de datos utilizando únicamente MySQL y no un editor de texto, esto reducirá el riesgo de causar más problemas.

0

La respuesta aceptada no funcionó para mí.

De aquí http://nicj.net/mysql-converting-an-incorrect-latin1-column-to-utf8/ He encontrado que el código binario para el caracter  es c2a0 (al convertir la columna a VARBINARIO y viendo a qué se convierte).Entonces aquí http://www.oneminuteinfo.com/2013/11/mysql-replace-non-ascii-characters.html encontró la solución real para eliminar (sustituir) que:

update entry set english_translation = unhex(replace(hex(english_translation),'C2A0','20')) where entry_id = 4008; 

La consulta anterior reemplaza a un espacio, a continuación, un ajuste normal puede ser aplicado o simplemente reemplazar a '' en su lugar.

Cuestiones relacionadas