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

Tiefgreifendes Verständnis der sieben Kommunikationsmethoden von Vue-Komponenten

Inhaltsverzeichnis 1. Requisiten/$emit Einführung...

Warum node.js nicht für große Projekte geeignet ist

Inhaltsverzeichnis Vorwort 1. Anwendungskomponent...

Welche Bilddateiformate gibt es und wie wählt man sie aus?

1. Welche drei Formate? Dies sind: gif, jpg und pn...

HTML-Hyperlinks im Detail erklärt

Hyperlink Hyperlinks sind die am häufigsten verwen...

Detaillierte Erklärung der JavaScript-Timer

Inhaltsverzeichnis Kurze Einleitung Intervall fes...

Detaillierte Erklärung der MySQL-Datenbank-Trigger

Inhaltsverzeichnis 1 Einleitung 2 Trigger-Einführ...

IE6-Verzerrungsproblem

Frage: <input type="hidden" name=&qu...

Die unangemessenen MaxIdleConns von MySQL führen zu kurzen Verbindungen

1 Hintergrund Vor kurzem sind im Online-Geschäft ...

Eine kurze Analyse, wie MySQL die Transaktionsisolierung implementiert

Inhaltsverzeichnis 1. Einleitung 2. RC- und RR-Is...