Heim > Datenbank > MySQL-Tutorial > Hauptteil

Warum führt das Einfügen von 0 in ein MySQL-BIT(1)-Feld zu 1?

Patricia Arquette
Freigeben: 2024-11-03 05:42:02
Original
842 Leute haben es durchsucht

Why Does Inserting 0 into a MySQL BIT(1) Field Result in 1?

Das Einfügen von 0 in ein MySQL BIT(1)-Feld führt zu 1: Problem und Lösung

Ein Versuch, einen 0-Wert in ein einzufügen Das BIT(1)-Feld in MySQL, das PDO-vorbereitete Anweisungen verwendet, führt unerwartet dazu, dass ein Wert von 1 in die Tabelle geschrieben wird. Dieses Verhalten tritt trotz der Verwendung verschiedener Formen der Parameterbindung und sogar von Roh-SQL auf, jedoch nur beim Einfügen des Werts 0.

Warum Platzhalter beim Einfügen von 0 fehlschlagen

Die BIT-Spalte in MySQL ist ein Binärtyp, der Kompatibilitätsprobleme mit Client-Bibliotheken wie PDO verursachen kann. Das Problem tritt aus folgenden Gründen auf:

  • BIT-Spalten sind byteorientiert und verbrauchen ein volles Byte für jede Zeile, unabhängig von der angegebenen Größe.
  • PDO interpretiert die 0 falsch Wert als Bit 1 aufgrund von Byte-Ausrichtungsproblemen.

Lösung: Verwenden Sie stattdessen TINYINT(1)

Um dieses Problem zu beheben, wird eine Änderung empfohlen der Spaltentyp von BIT(1) bis TINYINT(1). Dadurch wird sichergestellt, dass jeder Zeile unabhängig vom eingefügten Wert ein einzelnes Byte zugewiesen wird. TINYINT(1) kann auch zum Speichern boolescher Werte verwendet werden, wodurch Kompatibilitätsprobleme mit BIT-Spalten beseitigt werden.

Zum Beispiel sollte der folgende Code ordnungsgemäß funktionieren:

$pdo = new PDO("connection string etc") ;
$statement = $pdo->prepare('INSERT INTO `test` (SomeText,TestBool) VALUES (?,?)') ;
$statement->execute(array("TEST",0)) ;
Nach dem Login kopieren

Wenn Sie immer noch möchten Um BIT(1) zu verwenden, können Sie die folgende Problemumgehung versuchen:

$statement = $pdo->prepare('INSERT INTO `test` (SomeText,TestBool) VALUES (:someText,:testBool)') ;
$statement->bindValue(':someText', "TEST");
$statement->bindValue(':testBool', 0, PDO::PARAM_INT);
$statement->execute();
Nach dem Login kopieren

Der Wechsel zu TINYINT(1) ist jedoch die bevorzugte Lösung, da es ein konsistentes Verhalten über verschiedene Datentypen hinweg bietet und die Kompatibilität mit verschiedenen Clients gewährleistet Bibliotheken.

Das obige ist der detaillierte Inhalt vonWarum führt das Einfügen von 0 in ein MySQL-BIT(1)-Feld zu 1?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage