¿Cómo puedo encontrar caracteres que no sean ASCII en MySQL?

Estoy trabajando con una base de datos MySQL que tiene algunos datos importados de Excel . Los datos contienen caracteres que no son ASCII (guiones, etc.), así como retornos de carro ocultos o alimentaciones de línea. ¿Hay alguna manera de encontrar estos registros usando MySQL?

Depende exactamente de lo que esté definiendo como “ASCII”, pero le sugiero que pruebe una variante de una consulta como esta:

SELECT * FROM tableName WHERE NOT columnToCheck REGEXP '[A-Za-z0-9]'; 

Esa consulta devolverá todas las filas donde columnToCheck contiene caracteres no alfanuméricos. Si tiene otros caracteres que son aceptables, agréguelos a la clase de caracteres en la expresión regular. Por ejemplo, si los puntos, las comas y los guiones son correctos, cambie la consulta a:

 SELECT * FROM tableName WHERE NOT columnToCheck REGEXP '[A-Za-z0-9.,-]'; 

La página más relevante de la documentación de MySQL es probablemente 12.5.2 Expresiones regulares .

MySQL proporciona una administración integral del conjunto de caracteres que puede ayudar con este tipo de problema.

 SELECT whatever FROM tableName WHERE columnToCheck <> CONVERT(columnToCheck USING ASCII) 

La función CONVERT(col USING charset) convertirá los caracteres no convertibles en caracteres de reemplazo. Entonces, el texto convertido y no convertido será desigual.

Vea esto para más discusión. http://dev.mysql.com/doc/refman/5.7/en/charset-repertoire.html

Puede usar cualquier nombre de conjunto de caracteres que desee en lugar de ASCII. Por ejemplo, si desea saber qué caracteres no se procesarán correctamente en la página de códigos 1257 (lituano, letón, estonio), use CONVERT(columnToCheck USING cp1257)

Puede definir ASCII como todos los caracteres que tienen un valor decimal de 0 – 127 (0x00 – 0x7F) y encontrar columnas con caracteres que no sean ASCII con la siguiente consulta

 SELECT * FROM TABLE WHERE NOT HEX(COLUMN) REGEXP '^([0-7][0-9A-F])*$'; 

Esta fue la consulta más completa que pude encontrar.

Esto es probablemente lo que estás buscando:

 select * from TABLE where COLUMN regexp '[^ -~]'; 

Debería devolver todas las filas donde COLUMN contenga caracteres que no sean ASCII (o caracteres ASCII no imprimibles como nueva línea).

Un carácter que falta en los ejemplos anteriores de todos es el carácter de terminación (\ 0). Esto es invisible para la salida de la consola MySQL y no es detectable por ninguna de las consultas mencionadas anteriormente. La consulta para encontrarlo es simplemente:

 select * from TABLE where COLUMN like '%\0%'; 

Basado en la respuesta correcta, pero teniendo en cuenta los caracteres de control ASCII también, la solución que funcionó para mí es esta:

 SELECT * FROM `table` WHERE NOT `field` REGEXP "[\\x00-\\xFF]|^$"; 

Hace lo mismo: busca violaciones del rango ASCII en una columna, pero también le permite buscar caracteres de control, ya que usa la notación hexadecimal para los puntos de código. Como no hay comparación o conversión (a diferencia de la respuesta de @ Ollie), esto también debería ser mucho más rápido. (Especialmente si MySQL finaliza anticipadamente en la consulta de expresiones regulares, que definitivamente debería).

También evita devolver campos que son de longitud cero. Si desea una versión ligeramente más larga que pueda tener un mejor rendimiento, puede usar esto en su lugar:

 SELECT * FROM `table` WHERE `field` <> "" AND NOT `field` REGEXP "[\\x00-\\xFF]"; 

Realiza una comprobación separada de la longitud para evitar resultados de longitud cero, sin considerarlos para un pase de expresión regular. Dependiendo de la cantidad de entradas de longitud cero que tenga, esto podría ser significativamente más rápido.

Tenga en cuenta que si su juego de caracteres predeterminado es algo extraño donde 0x00-0xFF no se correlaciona con los mismos valores que ASCII (¿existe tal conjunto de caracteres en alguna parte?), Esto arrojaría un falso positivo. De lo contrario, disfruta!

Intente utilizar esta consulta para buscar registros de caracteres especiales

 SELECT * FROM tableName WHERE fieldName REGEXP '[^a-zA-Z0-9@:. \'\-`,\&]' 

La respuesta de @ zende fue la única que cubría columnas con una mezcla de caracteres ascii y no ascii, pero también tenía esa cosa problemática. Usé esto:

 SELECT * FROM `table` WHERE NOT `column` REGEXP '^[ -~]+$' AND `column` !='' 

para esta pregunta también podemos usar este método:

Pregunta del zoo de sql:
Encuentra todos los detalles del premio ganado por PETER GRÜNBERG

Caracteres no ASCII

ans: select * from nobel donde el ganador like’P% GR% _% berg ‘;