2016-12-21 6 views
0

Ich habe eine Tabelle in MySQL mit einem binären Feldnamen 'aktiv' erstellt und standardmäßig auf NULL festgelegt.In SQL kann keine Binärzahl auf 1 gesetzt werden

Aber wenn ich es mit diesem Befehl aktualisieren möchten:

$update_users = $bdd -> query("UPDATE users SET `active` = 1 WHERE `id` = '$data1' LIMIT 1") or die(mysql_error()); 

Das Feld ist auf 31 aktualisiert! und nicht auf 1

Ich habe auch versucht,

SET `active` = true 

aber dasselbe Ergebnis.

ps: Ich habe 'aktiv' gesetzt mit phpMyAdmin-Schnittstelle (keine SQL-Anweisung), aber hier sind die Werte dieses Feldes: Typ => Binär (1), Null => ja, Defaut => NULL

+0

Können Sie auch angeben, wie Sie 'aktiv' definiert haben? – wogsland

+0

Ich bemerke etwas falsch in Ihrem Code: Sie verwenden 'mysqli', um die Datenbank (' $ bdd-> query() ') und' mysql_error() 'abzufragen. Sie können nicht mysql_xx() 'und' mysqli_xx() '' –

+0

mischen Warum haben Sie Anführungszeichen für den Feldnamen? – Kostis

Antwort

1

0x31 == 49 ist die ASCII code des Zeichens '1'.

Der Wert wird in der Spalte gespeichert, aber because of its type wird in einem speziellen Format zurückgegeben: Jedes Byte aus dem Wert wird in seiner hexadezimalen Darstellung angezeigt (2 Großbuchstaben hex digits). Abhängig vom verwendeten MySQL-Client kann das hexadezimale Präfix 0x in der Ausgabe vorhanden sein oder nicht.

Wie die documentation erklärt, enthält der BINARY Typ Strings (ähnlich wie CHAR Typen). Aus diesem Grund wird der numerische Wert, den Sie einfügen möchten (1), als Zeichenfolge behandelt und wird zum Zeichen '1').

Um die Zahl 1 in eine BINARY Spalte zu speichern, müssen Sie den Charakter '0x01' darin speichern:

UPDATE users SET `active` = 0x01 WHERE `id` = '$data1' LIMIT 1 

Oder Sie besser den TINYINT Typen stattdessen verwenden.

1

Ich denke, du verwirrst BINARY. Nach dem documentation:

Die BINARY und VARBINARY-Typen sind ähnlich wie CHAR und VARCHAR, mit der Ausnahme, dass sie Binärketten anstatt nichtbinärer Zeichenfolgen enthalten. Das heißt, sie enthalten Byte-Zeichenfolgen anstelle von Zeichenfolgen. Dies bedeutet, dass sie den binären Zeichensatz und die Sortierfolge haben und Vergleich und Sortierung auf den numerischen Werten der Bytes in den Werten basieren.

Aus dem Blick auf Ihre Frage nehme ich an, was Sie wirklich wollen, ist etwas wie ein boolescher Wert (0 oder 1) und keine binären Daten. In diesem Fall entweder TINYINT(1) oder BIT(1) verwenden.

Verwandte Themen