Como posso encontrar caracteres não-ASCII no MySQL?

votos
95

Eu estou trabalhando com um banco de dados MySQL que tem alguns dados importados de Excel . Os dados contém não ASCII caracteres (traços EM, etc.), bem como os retornos de carro ocultos ou alimentações de linha. Existe uma maneira de encontrar esses registros usando MySQL?

Publicado 30/12/2008 em 23:54
fonte usuário
Em outras línguas...                            


10 respostas

votos
51

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 NOT columnToCheck 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 os períodos, vírgulas e hífens são OK, alterar a consulta para:

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

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

Respondeu 31/12/2008 em 00:19
fonte usuário

votos
41

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).

Respondeu 12/03/2009 em 17:00
fonte usuário

votos
91

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.

Respondeu 09/08/2009 em 23:58
fonte usuário

votos
158

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 CONVERT(col USING charset)função 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. http://dev.mysql.com/doc/refman/5.7/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 (,, Estoniano Letão Lituano) usoCONVERT(columnToCheck USING cp1257)

Respondeu 31/07/2012 em 14:33
fonte usuário

votos
11

Um personagem que faltava a partir de 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%';
Respondeu 26/08/2013 em 21:22
fonte usuário

votos
1

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: pesquisas por violações do intervalo ASCII em uma coluna, mas permite procurar 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 existência em qualquer lugar?), Este retornaria um falso positivo. Caso contrário, divirta-se!

Respondeu 05/01/2016 em 00:37
fonte usuário

votos
0

Tente usar essa consulta para pesquisar registros de caracteres especiais

SELECT *
FROM tableName
WHERE fieldName REGEXP '[^a-zA-Z0-9@:. \'\-`,\&]'
Respondeu 12/09/2016 em 07:51
fonte usuário

votos
0

@ Resposta de 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` !=''
Respondeu 29/11/2017 em 20:39
fonte usuário

votos
0

para esta pergunta também podemos usar este método:

Pergunta de zoológico sql:
Encontre todos os detalhes do prémio ganho por Peter Grünberg

caracteres não-ASCII

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

Respondeu 25/03/2018 em 14:38
fonte usuário

votos
0

No Oracle, podemos usar abaixo.

SELECT * FROM TABLE_A WHERE ASCIISTR(COLUMN_A) <> COLUMN_A;
Respondeu 28/02/2019 em 06:37
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more