Question

Je travaille avec une base de données MySQL dans laquelle certaines données sont importées à partir de Excel . Les données contiennent des caractères autres que ASCII (tirets, etc.) ainsi que des retours à la ligne masqués ou sauts de ligne. Est-il possible de trouver ces enregistrements en utilisant MySQL?

Était-ce utile?

La solution

Cela dépend exactement de ce que vous définissez comme "ASCII", mais je suggérerais d'essayer une variante d'une requête comme celle-ci:

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

Cette requête renverra toutes les lignes où columnToCheck contient des caractères non alphanumériques. Si vous avez d'autres caractères acceptables, ajoutez-les à la classe de caractères dans l'expression régulière. Par exemple, si les points, les virgules et les traits d'union sont corrects, modifiez la requête en:

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

La page la plus pertinente de la documentation MySQL est probablement 12.5.2 Expressions régulières .

Autres conseils

MySQL fournit une gestion complète des jeux de caractères qui peut vous aider à résoudre ce type de problème.

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

La fonction CONVERT (col USING charset) transforme les caractères non convertibles en caractères de remplacement. Ensuite, les textes convertis et non convertis seront inégaux.

Voir ceci pour plus de discussion. https://dev.mysql.com/doc/refman/8.0 /en/charset-repertoire.html

Vous pouvez utiliser n’importe quel nom de jeu de caractères à la place d’ASCII. Par exemple, si vous souhaitez savoir quels caractères ne seront pas restitués correctement dans la page de code 1257 (lituanien, letton, estonien), utilisez CONVERT (columnToCheck UTILISER cp1257)

Vous pouvez définir ASCII comme tous les caractères ayant une valeur décimale comprise entre 0 et 127 (0x00 - 0x7F) et rechercher des colonnes avec des caractères non-ASCII à l'aide de la requête suivante

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

C’est la requête la plus complète que je puisse trouver.

;

C’est la requête la plus complète que je puisse trouver.

C’est probablement ce que vous recherchez:

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

Il devrait renvoyer toutes les lignes où COLUMN contient des caractères non-ASCII (ou des caractères ASCII non imprimables tels que newline).

Un caractère manquant parmi tous les exemples ci-dessus est le caractère de fin (\ 0). Ceci est invisible pour la sortie de la console MySQL et ne peut être découvert par aucune des requêtes mentionnées précédemment. La requête pour le trouver est simplement:

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

Sur la base de la réponse correcte, mais en prenant également en compte les 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]|^
SELECT * FROM `table` WHERE `field` <> "" AND NOT `field` REGEXP  "[\\x00-\\xFF]";
quot;;

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

Cela é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 ceci à la place:

<*>

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

Notez que si votre jeu de caractères par défaut est bizarre et que 0x00-0xFF ne correspond pas aux mêmes valeurs que l'ASCII (existe-t-il un tel jeu de caractères?), le résultat serait un faux positif. Sinon, profitez-en!

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@:. \'\-`,\&]'

La réponse de @ zende était la seule à couvrir les colonnes avec un mélange de caractères ascii et non ascii, mais elle comportait également cette problématique problématique. J'ai utilisé ceci:

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

Sous Oracle, nous pouvons utiliser ci-dessous.

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

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

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

Caractères non-ASCII

ans: sélectionnez * parmi nobel où le gagnant aime'P% GR% _% berg ';

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top