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

Detaillierte Schritte zur Installation von MySQL auf CentOS 7

Wenn wir in CentOS7 MySQL installieren, wird Mari...

Detaillierte Erklärung des Docker-Befehls zum Sichern des Linux-Systems

Tar-Backup-System sudo tar cvpzf backup.tgz --exc...

Beispielcode zur einfachen Implementierung des Seitenlayouts mit Flex-Layout

Kommen wir ohne weitere Umschweife direkt zum Cod...

Schnelle Lösung zum Vergessen des MySQL8-Passworts

Vorwort Wenn wir das MySQL-Datenbankkennwort verg...

Zusammenfassung der Benutzererfahrung

Unabhängig davon, ob Sie an Software oder Websites...

Dieser Artikel zeigt Ihnen, wie Sie mit CSS-Rahmen spielen

Rahmenstil Die Eigenschaft „Border-Style“ gibt an...

Docker installiert Elasticsearch7.6-Cluster und legt Passwort fest

Ab Elasticsearch 6.8 dürfen kostenlose Benutzer d...

Installieren Sie Mininet aus dem Quellcode auf Ubuntu 16.04

Mininet Mininet ist eine leichtgewichtige, softwa...

Erfahren Sie, wie Sie Nginx schnell in CentOS7 installieren

Inhaltsverzeichnis 1. Übersicht 2. Laden Sie das ...

Detaillierte Analyse mehrerer Situationen, in denen MySQL-Indizes fehlschlagen

1. Führende Fuzzy-Abfragen können keinen Index ve...

Verwendungsanweisungen für den Befehl „Docker Create“

Mit dem Befehl „Docker Create“ können Sie einen C...

Verwenden Sie CSS, um die Breite von INPUT in TD festzulegen

Als ich kürzlich mit C# ein Webprogramm erstellte,...

CSS-Implementierungscode für die Textausrichtung

Beim Erstellen von Formularen kommt es häufig vor...