Heim >Datenbank >MySQL-Tutorial >Lösen Sie das Problem von Indexfehlern und ungenauen Daten, die durch die „implizite Konvertierung' von MySQL 5.6 verursacht werden.
Eine SQL-Abfrage Als ich versuchte, das Vachar-Typfeld in der Where-Bedingung abzufragen, indem ich die einfachen Anführungszeichen entfernte, stellte ich fest, dass diese Anweisung, die schnell sein sollte, tatsächlich sehr langsam war. Dieses Varchar-Feld verfügt über einen zusammengesetzten Index. Die Gesamtzahl der Einträge beträgt 58989, und die gefundenen Daten sind auch ohne einfache Anführungszeichen nicht die von uns gewünschten Daten.
Wir verwenden MySQL Version 5.6. Die tatsächliche Situation der innoDB-Engine ist wie folgt: Werfen wir einen Blick auf die Ausführungsergebnisse. In der obigen Beschreibung müssen wir auch auf die Zeichenfolge achten Ihrer Where-Bedingung Es muss eine vollständige Zahl ohne einfache Anführungszeichen sein. Andernfalls wird ein Fehler gemeldetund die gefundenen Daten sind möglicherweise nicht die von uns gewünschten Daten. Wie in der Abbildung unten gezeigt
Warum ist das so? Warum führt der MySQL-Optimierer die Typkonvertierung nicht direkt durch?
Die Einführung von einfachen Anführungszeichen in SQL-Anweisungen bedeutet, dass dieser Typ der Zeichenfolgendatentyp CHAR, VARCHAR, BINARY, VARBINARY, BLOB, TEXT, ENUM und SET ist. .Wenn Sie keine einfachen Anführungszeichen hinzufügen, bedeutet dies, dass es sich um einen anderen Typ als eine Zeichenfolge handelt, z. B. int, bigDecimal usw.
Wenn Sie einer Zeichenfolge mit Untertiteln und Sonderzeichen keine einfachen Anführungszeichen hinzufügen, führt dies zu einer Typkonvertierung Fehler. SQL kann nicht ausgeführt werden. Wie im Bild oben gezeigt:1054 - Unknown column '000w1993521' in 'where clause', Time: 0.008000sWerfen wir zunächst einen Blick auf den Ausführungsprozess eines SQL
1 Bedingungen generieren
Wenn ein Operator mit Operanden unterschiedlichen Typs verwendet wird, erfolgt eine Typkonvertierung, um die Operanden kompatibel zu machen. Dann erfolgt eine implizite Konvertierung:
Wenn mindestens einer der beiden Parameter NULL ist, ist das Vergleichsergebnis auch NULL. Die Ausnahme besteht darin, dass zwei NULL-Werte verglichen werden Rückgabe 1. In beiden Fällen ist keine Typkonvertierung erforderlich
2. Fragen Sie nicht übereinstimmende Werte (oder teilweise übereinstimmende Werte) ab, wie die obigen Abfrageergebnisse. Sie müssen sich unbedingt den Quellcode ansehen. Dies ist die implizite Konvertierungsregel von MYsql. Ich werde es hier nicht im Detail analysieren (da keine relevanten Dokumente gefunden wurden).
Aus historischen Gründen muss es mit dem alten Design kompatibel sein. Sie können die Typkonvertierungsfunktionen „cast“ und „convert“ von MySQL verwenden, um explizit zu konvertieren.
Zusammenfassung
Wenn Sie mehr über die Programmierung erfahren möchten, bleiben Sie bitte auf dem Laufenden PHP-Schulung Kolumne!
Das obige ist der detaillierte Inhalt vonLösen Sie das Problem von Indexfehlern und ungenauen Daten, die durch die „implizite Konvertierung' von MySQL 5.6 verursacht werden.. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!