Eine kurze Erläuterung verschiedener Situationen, in denen MySQL Boolesche Typen zurückgibt

Eine kurze Erläuterung verschiedener Situationen, in denen MySQL Boolesche Typen zurückgibt

mysql gibt den Booleschen Typ zurück

Bildbeschreibung hier einfügen

Im ersten Fall direkt zurück

select id='22aa' from mytest where age=202 gibt 1 zurück, was als true gekapselt werden kann
select count(*)=1 from mytest where age=202 gibt 1 zurück, was als true gekapselt werden kann
select count(*)=0 from mytest where age=202 gibt 0 zurück und kann als false gekapselt werden
select count(*)<3 from mytest where age=202 gibt 1 zurück, was als true gekapselt werden kann
select count(*)<=1 from mytest where age=202 gibt 1 zurück, was als true gekapselt werden kann
select name="aa" from mytest where age=10 Wenn der Name null ist, meldet SQL keinen Fehler und das zurückgegebene Ergebnis ist ebenfalls null. Im zweiten Fall beziehen Sie sich auf den SQL 3-Code und es wird ein Fehler gemeldet.

Zusammenfassen:

Diese Situation ähnelt der Urteilsbegründung in Java. Es ist nur so, dass in Java = Zuweisung bedeutet, also wird == zur Beurteilung verwendet, während in MySQL set zur Zuweisung verwendet wird und = direkt zur Beurteilung.

Im zweiten Fall kann die Rückgabe von 0 oder 1 ebenfalls den Zweck erfüllen

select enable aus mytest, wobei age=202 1 zurückgibt, was als true verpackt werden kann
select count(*) aus mytest gibt 4 zurück, was als Boolean-Typ gekapselt werden kann, aber falsch ist
select enable from mytest where age=201 gibt null zurück. Kann nicht als Boolescher Typ gekapselt werden. Der Code meldet direkt einen Fehler. select id from mytest where age=202 gibt „22aa“ zurück. Kann als Boolescher Typ gekapselt werden, ist aber falsch.
select id from mytest where age=202 gibt 'true' zurück. Kann als Boolescher Typ gekapselt werden, ist aber wahr.
select id from mytest where age=202 gibt 'false' zurück, was als Boolean-Typ gekapselt werden kann, false
//Sonderfall select * from mytest Fehler Es wurde erwartet, dass selectOne() ein Ergebnis (oder null) zurückgibt, aber gefunden: 4
select * from mytest where age=202 gibt einen Datensatz false 2019-08-28 202 15 1 zurück, der als false gekapselt werden kann
select * from mytest where age=202 gibt einen Datensatz true 2019-08-28 202 15 1 zurück, der als true gekapselt werden kann
select * from mytest where age=202 gibt einen Datensatz aaaa2019-08-28 202 15 1 zurück, der als false gekapselt werden kann

Zusammenfassen:

Mybatis konvertiert basierend auf der Anzahl der abgefragten Datensätze (1=wahr, 0=falsch)

Zu beachtende Punkte: Wenn mehrere Datensätze (größer als 1) gefunden werden, aber „false“ zurückgegeben wird, ist dies genau das Gegenteil von dem, was wir erwarten. Hier können Sie andere Methoden zur Beurteilung verwenden, indem Sie die Anzahl der Datensätze zurückgeben, oder Sie können sicherstellen, dass die Datensätze in der Datenbank eindeutig sind. Du kannst zur Lösung auch direkt den ersten Fall nutzen.

Gemäß dem Test der SQL-Anweisungen 4, 5 und 6 kann die Zeichenfolge, wenn sie „true“ ist, als wahr gekapselt werden, wenn sie „false“ ist, kann sie als falsch gekapselt werden und die Zeichenfolgen in anderen Situationen sind alle falsch.

(Das ist nur eine Vermutung, nicht genau. Sie müssen auf der offiziellen MySQL-Website nachschauen. Wenn das zurückgegebene Feld ein String ist, welche Regeln werden dann verwendet, um es in einen Booleschen Wert umzuwandeln? Ich vermute, es ähnelt der Methode zum Umwandeln von Strings in Boolesche Werte in Java: Boolean.valueOf("aaa") //false, die Methode lautet wie folgt)

Bildbeschreibung hier einfügen

Bildbeschreibung hier einfügen Was die Situation betrifft, in der die SQL-Anweisungen 8, 9 und 10 eine Gruppe zurückgeben, aber nur ein Datenelement akzeptiert wird, muss noch weiter untersucht werden, warum der ID-Wert zur Kapselung verwendet wird.

Fallstricke bei MySQL-Booleschen Typen

In MySQL ist Boolean lediglich ein Alias ​​für tinyint(1), was bedeutet, dass es in MySQL keinen echten Bool-Typ gibt. SQLAlchemy hat dies jedoch beim Generieren von SQL nicht erkannt, was zu einem Problem führte. Wenn der Typ bool als Abfragebedingung verwendet wird, kann der Index nicht verwendet werden, was zu einem Tabellenscan führt:

> SELECT COUNT(*) FROM Nachricht, wobei Nachricht.is_national = 1 AND Nachricht.aktualisiert_at > '2020-01-01 00:00:00' AND Nachricht.gelöscht_at IS NULL;
+----------+
| ANZAHL(*) |
+----------+
| 0 |
+----------+
1 Reihe im Set
Zeit: 0,018 s
> SELECT COUNT(*) FROM message, WHERE message.is_national ist wahr UND message.updated_at > '2020-01-01 00:00:00' UND message.deleted_at IST NULL;
+----------+
| ANZAHL(*) |
+----------+
| 0 |
+----------+
1 Reihe im Set
Zeit: 2.162s

Achten Sie auf die Zeit der ersten und zweiten Zeile. Es ist offensichtlich, dass die zweite Zeile den Index nicht verwendet. Werfen wir einen Blick auf die Ergebnisse von EXPLAIN, um die Antwort zu sehen:

> EXPLAIN SELECT COUNT(*) FROM message WHERE message.is_national = 1 AND message.updated_at > '2020-01-01 00:00:00' AND message.de
        leted_at IST NULL;
| ID | Auswahltyp | Tabelle | Typ | mögliche Schlüssel | Schlüssel | Schlüssellänge | Ref. | Zeilen | Extra |
| 1 | EINFACH | Nachricht | ref | ix_message_updated_at,idx_updated_at_is_national,ix_message_is_national | ix_message_is_national | 1 | const | 1 | Verwenden von where |

> EXPLAIN SELECT COUNT(*) FROM message WHERE message.is_national is true AND message.updated_at > '2020-01-01 00:00:00' AND messageag
        e.deleted_at IST NULL;
| ID | Auswahltyp | Tabelle | Typ | mögliche Schlüssel | Schlüssel | Schlüssellänge | Ref. | Zeilen | Extra |
| 1 | SIMPLE | Nachricht | ALLE | ix_message_updated_at,idx_updated_at_is_national | <null> | <null> | <null> | eine sehr große Zahl | Mit was
bezüglich |

Dazu möchte ich nur sagen: Das ist Abzocke!

Das Obige ist meine persönliche Erfahrung. Ich hoffe, es kann Ihnen als Referenz dienen. Ich hoffe auch, dass Sie 123WORDPRESS.COM unterstützen werden.

Das könnte Sie auch interessieren:
  • Mysql setzt Boolesche Typoperationen
  • Mybatis verbindet sich mit MySQL-Datenbank Tinyint ist ein Boolescher Typ detaillierte Erklärung
  • So speichern Sie „false“ oder „true“ in MySQL

<<:  CSS3-Lösung für das Problem des Einfrierens auf Mobilgeräten (Optimierung der Animationsleistung)

>>:  Benutzererfahrung bei der Neugestaltung der Portal-Website

Artikel empfehlen

Eine kurze Analyse der Konfigurationselemente des Angular CLI-Releasepfads

Vorwort Bei der Projektfreigabe ist immer eine Ve...

JavaScript, um den Effekt des Tab-Leistenwechsels zu erzielen

Registerkartenleiste: Klicken Sie auf verschieden...

Antworten auf mehrere häufig gestellte MySQL-Interviewfragen

Vorwort: Bei Vorstellungsgesprächen für verschied...

Detaillierte Erläuterung der MySQL-Mehrtabellenabfrage

Die Zeit vergeht immer überraschend schnell, ohne...

Wie gestaltet man eine Webseite? Wie erstelle ich eine Webseite?

Wenn es um das Verständnis von Webdesign geht, sc...

So verwenden Sie den MySQL-Autorisierungsbefehl „grant“

Die Beispiele in diesem Artikel laufen auf MySQL ...

So installieren Sie Linux Flash

So installieren Sie Flash unter Linux 1. Besuchen...

Anwendungsbeispiel-Tutorial zum Schlüssel-Rendering in Vue

Einführung Während des Front-End-Projektentwicklu...

Detaillierte Erklärung des JavaScript-Fortschrittsmanagements

Inhaltsverzeichnis Vorwort Frage Prinzip prüfen V...

HTTP-Rückgabecodeliste (Erklärung auf Chinesisch und Englisch)

Liste der HTTP-Rückgabecodes (unten finden Sie ei...

html Option deaktivieren auswählen auswählen deaktivieren Option Beispiel

Code kopieren Der Code lautet wie folgt: <Ausw...

Warum ist die Bildlaufleiste auf der Webseite rechts angebracht?

Warum befinden sich die Bildlaufleisten der Brows...