Pergunta

Eu estou trabalhando com um banco de dados MySQL que tem alguns dados importados de href="http://en.wikipedia.org/wiki/Microsoft_Excel" rel="noreferrer"> Excel. Os dados contém não ASCII caracteres (em traços, etc.), bem como oculto transporte retorna ou alimentações de linha. Existe uma maneira de encontrar esses registros usando o MySQL?

Foi útil?

Solução

Depende exatamente o que você está definindo como "ASCII", mas gostaria de sugerir tentar uma variante de uma consulta como esta:

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

Essa consulta retornará todas as linhas onde columnToCheck contém quaisquer caracteres não alfanuméricos. Se você tem outros personagens que são aceitáveis, adicioná-los à classe de caracteres na expressão regular. Por exemplo, se pontos, vírgulas e hífens são OK, alterar a consulta para:

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

A página mais relevante da documentação MySQL é provavelmente 12.5.2 Expressões regulares .

Outras dicas

MySQL fornece gerenciamento abrangente conjunto de caracteres que podem ajudar com este tipo de problema.

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

A função CONVERT(col USING charset) vontade transforma os personagens unconvertable em caracteres de substituição. Em seguida, o texto convertido e não convertido será desigual.

Veja este para mais discussão. https://dev.mysql.com/doc/refman/8.0 /en/charset-repertoire.html

Você pode usar qualquer nome de conjunto de caracteres que você deseja no lugar de ASCII. Por exemplo, se você quiser saber quais caracteres não vai processar corretamente na página de código 1257 (lituano, letão, estónio) uso CONVERT(columnToCheck USING cp1257)

Você pode definir ASCII como todos os personagens que têm um valor decimal de 0 - 127 (0x00 - 0x7F) e encontrar colunas com caracteres não-ASCII usando a seguinte consulta

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

Esta foi a consulta mais abrangente que eu poderia vir acima com.

Este é provavelmente o que você está procurando:

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

Ele deve retornar todas as linhas em coluna contém caracteres não-ASCII (ou caracteres ASCII não imprimíveis, como a nova linha).

Um personagem faltando exemplos de todos acima é o carácter de terminação (\ 0). Este é invisível para a saída do console MySQL e não é detectável por qualquer uma das consultas até aqui mencionados. A consulta para encontrá-lo é simplesmente:

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

Com base na resposta correta, mas tendo em conta caracteres de controle ASCII, bem como, a solução que funcionou para mim é esta:

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

Ele faz a mesma coisa: procura por violações do intervalo ASCII em uma coluna, mas permite que você procure por caracteres de controle também, uma vez que utiliza a notação hexadecimal para o código pontos. Como não há comparação ou de conversão (ao contrário @ resposta de Ollie), este deve ser significativamente mais rápido também. (Especialmente se o MySQL faz cedo-terminação na consulta regex, que definitivamente deveria.)

Ele também evita o retorno campos que são comprimento zero. Se você quer uma versão ligeiramente mais longo que pode ter um melhor desempenho, você pode usar este em vez disso:

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

Ele faz um cheque separado para o comprimento para evitar resultados de comprimento zero, sem considerar-los por um passe de regex. Dependendo do número de entradas de comprimento zero você tem, isso poderia ser significativamente mais rápido.

Note-se que se o seu conjunto de caracteres padrão é algo bizarro onde 0x00-0xFF não mapear para os mesmos valores ASCII (existe tal conjunto de caracteres em qualquer lugar existência?), Este retornaria um falso positivo. Caso contrário, divirta-se!

Tente utilizar esta consulta para pesquisar registros de caracteres especiais

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

@ do Zende era o único que cobria colunas com uma mistura de caracteres ASCII e não ASCII, mas também tinha aquela coisa hex problemático. Eu usei isso:

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

No Oracle, podemos usar abaixo.

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

para esta pergunta também pode usar esse método:

Pergunta de zoológico sql:
Localizar todos os detalhes do won prêmio por Peter Grünberg

caracteres

Não-ASCII

ans: SELECT * FROM nobel onde vencedor like'P% GR% _% berg ';

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top