0
votes

Pourquoi comparer des chaînes dans la requête MySQL ne fonctionne pas

Je suis une requête de sélection très simple dans MySQL et ne fonctionne pas.

SELECT * FROM table_name WHERE TRIM(string_name)=TRIM('This is string one')


5 commentaires

La cause la plus courante que j'ai vue pour quelque chose comme ceci est des caractères non imprimés cachés dans le champ (par non-impression, je ne veux pas dire des espaces, quelle bordure aurait pris en charge). Essayez d'utiliser Char_length pour voir si Toute la chaîne a des longueurs à ne pas attendre. En outre, je ne sais pas si ce n'est qu'une question de présentation dans votre question, mais les chaînes se terminent par des périodes de votre exemple, et non dans votre exemple de vérification de l'égalité.


Avez-vous essayé d'utiliser comme ?


Oui, j'ai essayé char_length et cela me donne un numéro 1 ou 2 de plus que la longueur de la chaîne. Je pensais que c'est à cause des espaces et c'est pourquoi j'ai essayé de couper.


Souvent, ce sont des caractères de contrôle, des pauses de ligne, des onglets ou des terminaisons nuls qui n'ont pas été filtrés par le chemin d'entrée que les données sont entrées dans la base de données. Dans la plupart de ces cas, la finition ne vous aidera pas. Vous pouvez généralement les identifier à l'aide d'une combinaison de fonctions de chaîne pour obtenir les codes ASCII à chaque position, puis correctement avec remplacer pour supprimer les caractères problématiques. Cela peut être un peu douloureux, mais il s'agit généralement des premier ou des derniers caractères de la chaîne, et les mêmes personnages pour chaque ligne de problème, la détermination de la part des caractères incriminés peut donc venir tôt dans le processus.


Cela semble être le problème. J'ai inséré les données à partir d'un fichier CSV et je pense que la pause de la ligne provoque la question dans ma requête. Pouvez-vous suggérer comment dois-je vérifier si les chaînes ont une pause de ligne en eux.


3 Réponses :


0
votes

Avez-vous essayé d'utiliser comme à des fins de débogage? de
Sélectionnez * à partir de table_nomètre où string_name comme 'Ceci est la chaîne one'

/! \ ne vient pas de passer de = à comme , lisez sur pourquoi ici de
TLDR:

  1. = est apparemment 30 fois plus rapide.
  2. Utilisez = où que vous peut et comme où que vous DO . .

9 commentaires

Oui, j'ai essayé comme mais il n'y a pas de changement de sortie.


Je viens d'essayer de ma machine et ça marche avec =. Avez-vous essayé avec double " au lieu d'un seul ''? Si cela ne fonctionne toujours pas, l'esprit partageant la structure de votre table? J'ai essayé avec Varchar (255) et il travaillé de manière transparente.


Désolé Mate mais je pense que ma question n'est pas claire pour vous. Je sais dans des cas normaux = ou comme les deux opérateurs fonctionne comme prévu. S'il vous plaît voir la réponse de @uueerdo. Il y a des caractères cachés dans les cordes et ces personnages cachés causent le problème


En effet, je viens de lire son explication et je caurais un sens à ce que le problème vient des chevrefeaux dans votre fichier CSV. Avez-vous essayé d'importer le fichier CSV après avoir supprimé ces chevichets? Ou cherchez-vous un moyen de faire des problèmes dans votre SQL?


= et comme sont deux choses très différentes et il est étrange que quelqu'un suggère d'utiliser comme au lieu de = . Votre code doit être préparé pour un tel changement car certains caractères similaires (%, _) fonctionnent différemment.


@FIFONIK, je suggérant que l'utilisation de titres de déboguer et de trouver où vient le problème. J'impliquais avec le 2e BulletPoint dans ma citation que, dans cette situation, l'utilisateur ne devrait pas utiliser comme mais plutôt =, car il peut , ou du moins pourra une fois que son problème sera corrigé.


Désolé, je n'ai pas vu dans votre réponse que la suggestion est de déboguer uniquement. Quelqu'un à l'avenir peut décider juste de remplacer '=' par "comme"


@fifonik vous avez raison. J'ai mis à jour ma réponse pour refléter le fait que ce n'était qu'une suggestion de déboguer. Merci!


Avez-vous essayé de sélectionner * de TABLE_NAME où String_Name comme '% Ceci est la chaîne d'un%'?



2
votes

réitérer des commentaires; Parfois, des caractères de contrôle «non-impression» (comme de nouvelles lignes) peuvent se frayer un chemin dans des données qu'ils n'ont jamais été destinées à faire partie de. Vous pouvez le tester en vérifiant Char_length des valeurs de champ par rapport à ce que vous voyez réellement. Évidemment, sur de grandes quantités de données, cela peut être difficile; Mais si vous connaissez déjà une valeur problématique, vous pouvez utiliser cette méthode pour confirmer que c'est le problème de cette ligne avant de tenter d'identifier le caractère incriminé.

Une fois ce problème confirmé, vous pouvez utiliser des requêtes avec les fonctions ASC () et la sous-chaînes de MySQL pour identifier les codes de caractères jusqu'à ce que vous trouviez le caractère; Il peut être préférable de commencer à partir de la fin de la chaîne et de travailler, comme souvent les caractères incriminés sont à la fin.

Le caractère ou les caractères identifiés dans des lignes problématiques connus sont souvent la cause d'autres lignes problématiques également, l'identification de la question dans une ligne connue peut réellement aider à résoudre tous ces problèmes.

Une fois que le (s) code (s) de caractères est identifié, des requêtes comme où cord_name comme Concat ('%', char (13), char (10), char (10)) devrait fonctionner (dans ce cas pour les fenêtres traditionnelles nouvelles lignes) pour identifier d'autres lignes problématiques similaires. Évidemment, ajustez les codes de caractères et les caractères génériques en fonction de vos circonstances.

Si aucune ligne ne devrait jamais avoir ces caractères n'importe où, vous devriez pouvoir nettoyer les données avec une mise à jour comme celle-ci: Mettre à jour le jeu de titres Thestring = Remplacer (Remplacer (Thestring, Char (10), ''), Char (13), '') Pour supprimer les caractères incriminés. Encore une fois, utilisez les codes que vous avez réellement observés causant le problème; et vous pouvez les convertir aux espaces à la place si les circonstances sont mieux gérées comme une nouvelle ligne entre deux mots.


0 commentaires

0
votes

Tout d'abord, je dois reconnaître que les points faits par @uueerdo étaient en réalité la principale cause de ce problème. Même j'étais un peu sûr qu'il y a des personnages cachés dans la chaîne causant tout le problème, mais je ne savais pas comment trouver et résoudre ce caractère d'incroyable.

En outre, l'approche suggérée par @UueerDo à vérifier et à remplacer le caractère incriminant à l'aide du code ASCII semble très légitime mais comme il a lui-même mentionné que ce processus prendra beaucoup de temps et il faut vérifier manuellement chaque chaîne pour ce délinquant caractère puis le remplacer. P>

Heureusement après avoir passé quelques heures dessus, je suis arrivé avec une approche beaucoup plus rapide pour résoudre le problème. Pour cela, tout d'abord, je voudrais partager mon cas d'utilisation. P>

Ma première requête utilisait toutes les chaînes d'une base de données et imprimer le résultat à la page. P>

$result = mysqli_query($conn, "SELECT * FROM table_name";
while ($row = mysqli_fetch_array($result)){
    $string_var = $row["string_name"];
    $row_id = $row["id"];

    $update_row = mysqli_query($conn, "UPDATE table_name SET string_name='$string_var' WHERE id=$row_id");
}


0 commentaires