it-swarm.com.de

Unterschiedliche Zeichen, gleich ASCII Code?

Ich habe diese Abfrage, die zwei Ergebnisse auslöst:

SELECT id FROM table1 WHERE id like 'nm041033%'
  1. nm0410331
  2. nm0410331

Und diese etwas andere Abfrage, die nur ein Ergebnis liefert:

SELECT id FROM table1 WHERE id='nm0410331'
  1. nm0410331

Ich habe versucht, das ASCII des letzten Zeichens) zu überprüfen und habe das gleiche erhalten:

SELECT id,ascii(substr(id,9,1)) FROM table1 WHERE id like 'nm041033%'
  1. nm0410331 49
  2. nm0410331 49

Ich denke, es ist ein seltenes Codierungsproblem. Wie kann ich das lösen?

PS: Das Feld id ist ein Primärschlüssel. Der Zeichensatz ist latin1_general_ci Und die Werte wurden mit PHP utf8_decode() eingefügt.


PDATE : Ich habe den Zeichensatz in ascii_general_ci Geändert, und jetzt gibt mir diese Abfrage keine Ergebnisse:

SELECT id FROM table1 WHERE id='nm0410331'

Diese beiden IDs sind jedoch noch nicht identisch. Wenn ich SELECT DISTINCT Oder GROUP BY Verwende, erhalte ich zwei Zeilen.

PS: Das letzte Zeichen ist nicht die Nummer, die Sie mit der Tastatur eingeben können.

4

Dank der Erkenntnis von Akina , der vorschlug, HEX() zum Überprüfen des Feldes zu verwenden, fand ich am Ende eines der Werte ein zusätzliches '0A'-Byte.

Nachdem ich die Primärschlüsseleinschränkung entfernt hatte (um die temporäre doppelte ID zu vermeiden), verwendete ich: UPDATE table1 SET id = TRIM(TRAILING UNHEX('0A') FROM id); und konnte sie lösen.

PS: Für zukünftige Googler mit SELECT id FROM table1 WHERE id like 'nm0410331%' könnte mich auch dazu bringen, mein dummes Problem zu bemerken ...

4

Idealerweise sollten Sie die Daten nicht "bereinigen" müssen - Sie sollten sie mit TRIM ausfüllen - und eine geeignete Escape-Funktion verwenden ... wenn sich dort ein Zeilenumbruch einschleichen könnte - möglicherweise auch ein einfaches Anführungszeichen ... und hallo , willkommen bei SQL-Injection ....

2
eagle275