Pregunta

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 líneas de alimentación. ¿Hay alguna forma de encontrar estos registros utilizando MySQL?

¿Fue útil?

Solución

Depende exactamente de lo que estés definiendo como " ASCII " ;, pero sugeriría intentar una variante de una consulta como esta:

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

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

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

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

Otros consejos

MySQL proporciona una gestión completa de conjuntos 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.

Ver esto para más discusión. https://dev.mysql.com/doc/refman/8.0 /en/charset-repertoire.html

Puede usar cualquier nombre de conjunto de caracteres que desee en lugar de ASCII. Por ejemplo, si desea averiguar qué caracteres no se representará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 a 127 (0x00 - 0x7F) y encontrar columnas con caracteres no ASCII utilizando 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.

;

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 COLUMNA contenga caracteres no ASCII (o caracteres ASCII no imprimibles como, por ejemplo, nueva línea).

Un carácter que falta en los ejemplos anteriores es el carácter de terminación (\ 0). Esto es invisible para la salida de la consola MySQL y no puede ser detectado 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 también los caracteres de control ASCII, la solución que funcionó para mí es la siguiente:

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

Hace lo mismo: busca infracciones del rango ASCII en una columna, pero también le permite buscar caracteres de control, ya que utiliza la notación hexadecimal para los puntos de código. Como no hay comparación ni conversión (a diferencia de la respuesta de @ Ollie), esto también debería ser mucho más rápido. (Especialmente si MySQL realiza una terminación anticipada en la consulta de expresiones regulares, lo 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 funcionar mejor, puede usar esta en su lugar:

<*>

Hace una verificación separada de la longitud para evitar resultados de longitud cero, sin considerarlos para un pase de expresiones regulares. 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 conjunto de caracteres predeterminado es algo extraño, donde 0x00-0xFF no se asigna a los mismos valores que ASCII (¿existe un conjunto de caracteres de este tipo en algún lugar?), esto devolverí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 cubrió columnas con una mezcla de caracteres ascii y no ascii, pero también tenía esa cosa hexadecimal problemática. Utilicé esto:

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

En Oracle podemos usar a continuación.

SELECT * FROM TABLE_A WHERE ASCIISTR(COLUMN_A) <> COLUMN_A;

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

Pregunta del zoológico de sql:
Encuentre todos los detalles del premio ganado por PETER GRÜNBERG

Caracteres no ASCII

ans: seleccione * de nobel donde el ganador like'P% GR% _% berg ';

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top