Domanda

Sto lavorando con un database MySQL che ha alcuni dati importati da Excel . I dati contengono caratteri non ASCII (trattini, ecc.), Nonché ritorni a capo nascosti o avanzamenti di riga. C'è un modo per trovare questi record usando MySQL?

È stato utile?

Soluzione

Dipende esattamente da cosa stai definendo come " ASCII " ;, ma suggerirei di provare una variante di una query come questa:

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

Quella query restituirà tutte le righe in cui columnToCheck contiene caratteri non alfanumerici. Se hai altri caratteri accettabili, aggiungili alla classe di caratteri nell'espressione regolare. Ad esempio, se punti, virgole e trattini sono OK, modifica la query in:

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

La pagina più pertinente della documentazione MySQL è probabilmente 12.5.2 Espressioni regolari .

Altri suggerimenti

MySQL offre una gestione completa del set di caratteri che può aiutare con questo tipo di problema.

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

La funzione CONVERT (col USING charset) trasformerà i caratteri non convertibili in caratteri sostitutivi. Quindi, il testo convertito e non convertito sarà disuguale.

Vedi questo per ulteriori discussioni. https://dev.mysql.com/doc/refman/8.0 /en/charset-repertoire.html

È possibile utilizzare qualsiasi nome di set di caratteri desiderato al posto di ASCII. Ad esempio, se vuoi scoprire quali caratteri non verranno visualizzati correttamente nella tabella codici 1257 (lituano, lettone, estone) usa CONVERT (columnToCheck USING cp1257)

Puoi definire ASCII come tutti i caratteri che hanno un valore decimale compreso tra 0 e 127 (0x00 - 0x7F) e trovare colonne con caratteri non ASCII usando la seguente query

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

Questa è stata la query più completa che ho potuto inventare.

;

Questa è stata la query più completa che ho potuto inventare.

Questo è probabilmente quello che stai cercando:

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

Dovrebbe restituire tutte le righe in cui COLUMN contiene caratteri non ASCII (o caratteri ASCII non stampabili come newline).

Un carattere mancante dagli esempi di tutti sopra è il carattere di terminazione (\ 0). Ciò è invisibile all'output della console MySQL e non è rilevabile da nessuna delle query finora menzionate. La query per trovarlo è semplicemente:

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

Basato sulla risposta corretta, ma tenendo conto anche dei caratteri di controllo ASCII, la soluzione che ha funzionato per me è questa:

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

Fa la stessa cosa: cerca le violazioni dell'intervallo ASCII in una colonna, ma consente anche di cercare caratteri di controllo, poiché utilizza la notazione esadecimale per i punti di codice. Dato che non c'è confronto o conversione (a differenza della risposta di @ Ollie), anche questo dovrebbe essere significativamente più veloce. (Soprattutto se MySQL esegue la terminazione anticipata sulla query regex, cosa che dovrebbe assolutamente.)

Evita inoltre di restituire campi di lunghezza zero. Se desideri una versione leggermente più lunga che potrebbe funzionare meglio, puoi invece usarla:

<*>

Esegue un controllo separato per la lunghezza per evitare risultati di lunghezza zero, senza considerarli per un passaggio regex. A seconda del numero di voci di lunghezza zero che hai, questo potrebbe essere significativamente più veloce.

Nota che se il tuo set di caratteri predefinito è qualcosa di bizzarro in cui 0x00-0xFF non si associa agli stessi valori di ASCII (esiste un tale set di caratteri da qualche parte?), questo restituirebbe un falso positivo. Altrimenti, divertiti!

Prova a utilizzare questa query per cercare record di caratteri speciali

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

La risposta di @ zende era l'unica che copriva le colonne con un mix di caratteri ascii e non ascii, ma aveva anche quella problematica cosa esadecimale. Ho usato questo:

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

In Oracle possiamo usare di seguito.

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

per questa domanda possiamo anche usare questo metodo:

Domanda dello zoo sql:
Trova tutti i dettagli del premio vinto da PETER GR & # 220; NBERG

Caratteri non ASCII

ans: seleziona * da nobel dove vincitore come 'P% GR% _% berg';

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top