139 votes

Comment puis-je trouver des caractères non ASCII dans MySQL ?

Je travaille avec une base de données MySQL dont certaines données sont importées de Excel . Les données contiennent des données non ASCII (tirets, etc.) ainsi que les retours de chariot ou les sauts de ligne cachés. Existe-t-il un moyen de trouver ces enregistrements à l'aide de MySQL ?

8 votes

Ollie Jones a une bien meilleure réponse (voir en bas de page).

1 votes

@JonathanArkell Plus en bas maintenant :)

0 votes

Correction vérifiez le milieu ! ;)

4voto

Mahmoud Al-Qudsi Points 14815

En se basant sur la bonne réponse, mais en tenant également compte des caractères de contrôle ASCII, la solution qui a fonctionné pour moi est la suivante :

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

Il fait la même chose : il recherche les violations de la plage ASCII dans une colonne, mais vous permet également de rechercher les caractères de contrôle, car il utilise la notation hexadécimale pour les points de code. Puisqu'il n'y a pas de comparaison ou de conversion (contrairement à la réponse de @Ollie), cette méthode devrait également être beaucoup plus rapide. (Surtout si MySQL effectue une terminaison anticipée sur la requête regex, ce qu'il devrait certainement faire).

Elle évite également de renvoyer des champs de longueur nulle. Si vous souhaitez une version légèrement plus longue et plus performante, vous pouvez utiliser cette option :

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

Il effectue une vérification séparée de la longueur pour éviter les résultats de longueur nulle, sans les prendre en compte pour une passe de regex. Selon le nombre d'entrées de longueur nulle que vous avez, cela pourrait être beaucoup plus rapide.

Notez que si votre jeu de caractères par défaut est quelque chose de bizarre où 0x00-0xFF ne correspondent pas aux mêmes valeurs que l'ASCII (existe-t-il un tel jeu de caractères ?), cela renverra un faux positif. Sinon, profitez-en !

1 votes

00-FF comprend toutes les valeurs possibles de 8 bits, ce qui est ce qui REGEXP est en train de vérifier. Il est donc garanti qu'il correspond toujours. Aussi ^$ n'est probablement pas ce que vous vouliez.

0 votes

Il s'agit sans aucun doute de la meilleure solution REGEXP pour trouver tous les caractères 8 bits, mais elle n'est pas aussi bonne que la solution CONVERT(col USING charset), qui autorise également les caractères de contrôle tout en limitant les caractères d'affichage à un jeu de caractères spécifique.

2voto

Sachin Points 36

Essayez d'utiliser cette requête pour rechercher des enregistrements de caractères spéciaux

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

0voto

chiliNUT Points 3249

La réponse de @zende était la seule qui couvrait les colonnes avec un mélange de caractères ascii et non ascii, mais elle avait aussi ce problème d'hexagone. J'ai utilisé ceci :

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

0voto

Canicious Points 121

Dans Oracle, nous pouvons utiliser les éléments suivants.

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

-2voto

Hemen_boro Points 5

Pour cette question, nous pouvons également utiliser cette méthode :

Question de sql zoo :
Retrouvez tous les détails du prix remporté par PETER GRÜNBERG

Caractères non ASCII

ans : select*from nobel where winner like 'P% GR%_%berg' ;

2 votes

Où est le lien avec la question ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X