Eine leere Zeichenfolge in nicht-null-Spalte in MySQL?
Nutzte ich die standard mysql_connect(), mysql_query(), etc-Anweisungen für MySQL zu tun Sachen von PHP. In letzter Zeit habe ich schon die Umstellung auf die Verwendung der wunderbaren MDB2 Klasse. Zusammen mit ihm, ich bin mit prepared statements, so dass ich nicht sorgen über meine Flucht Eingangs-und SQL-injection-Angriffe.
Allerdings, ein problem gibt es ich in. Ich habe eine Tabelle mit ein paar VARCHAR-Spalten angegeben werden, die als nicht-null (nicht NULL-Werte zulassen). Mit der alten MySQL PHP Befehle, ich konnte Dinge tun, wie Sie dies ohne problem:
INSERT INTO mytable SET somevarchar = '';
Nun aber, wenn ich eine Abfrage wie:
INSERT INTO mytable SET somevarchar = ?;
Und dann in PHP habe ich:
$value = "";
$prepared = $db->prepare($query, array('text'));
$result = $prepared->execute($value);
Diese werfen den Fehler "null value violates not-null constraint
"
Als vorübergehende Lösung, ich überprüfen, ob $value
ist leer, und ändern Sie es zu " "
(ein einzelnes Leerzeichen), aber das ist eine schreckliche hack und verursachen andere Probleme.
Wie soll ich denn das einfügen von leeren Saiten mit prepared statements, ohne es zu versuchen, statt, legen Sie eine NULL?
EDIT: Es ist zu groß, ein Projekt zu gehen, durch meine gesamte Codebasis, finden überall verwendet einen leeren string "" und ändern Sie ihn auf NULL statt. Was ich wissen muss ist, warum die standard-MySQL-Abfragen zu behandeln, "" und NULL als zwei getrennte Dinge (wie ich denke ist richtig), aber prepared statements konvertiert "" in NULL.
Beachten Sie, dass "" und NULL sind nicht die gleiche Sache. Zum Beispiel SELECT NULL = "";
zurück NULL
statt 1
wie man es erwarten würde.
es ist "im Grunde "null" in der gleichen Weise, dass 0 ist "grundsätzlich" falsch. Sie sind ähnlich, aber eigentlich ganz anders.
NULL bedeutet "kein Wert" nicht "leere Zeichenfolge"
Das ist wahr, aber das speichern einer "leeren", dass es keine Daten enthält, wird der Wert, Im fast positiv ist kostet mehr als das speichern einer NULL
Sie sind richtig, dass die NULL ist nicht das gleiche wie "", aber man sollte Sie nicht tun, einen Vergleich wie SELECT NULL = ""; diese wird immer null zurückgegeben, unabhängig davon, welchen Wert Sie im Vergleich zu null
InformationsquelleAutor davr | 2008-11-05
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das klingt wie ein problem mit dem MDB2-API-Gefummel in PHP duck typing Semantik. Weil die leere Zeichenfolge in PHP ist äquivalent zu NULL, MDB2 ist wahrscheinlich mis-Behandlung als solche. Die ideale Lösung wäre, um eine Umgehungsmöglichkeit zu finden, für die es in der API, aber ich bin nicht allzu vertraut mit ihm.
Eine Sache, die Sie berücksichtigen sollten, ist jedoch, dass eine leere Zeichenkette in SQL ist nicht ein NULL-Wert. Sie können legen Sie Sie in den Zeilen als "NICHT NULL" just fine:
Wenn Sie nicht zu finden (oder implementieren) einen workaround im MDB2-API, ein hackish-Lösung (wenn auch etwas besser als die, die Sie gerade verwenden) könnte es sein, definieren Sie eine Benutzervariable für den leeren string --
Schließlich, wenn Sie müssen, verwenden Sie eine leere Zeichenfolge in eine INSERT-Anweisung, aber finden sich nicht in der Lage, die default-Wert für string-Typen in MySQL eine leere Zeichenfolge. So könnte man einfach weglassen, die Spalte von der INSERT-Anweisung, und es würde automatisch auf die leere Zeichenfolge gesetzt (vorausgesetzt, die Spalte eine not NULL-Einschränkung).
InformationsquelleAutor hark
Durch einige der Antworten, die ich realisiert, dass das problem möglicherweise in der MDB2-API und nicht in der PHP-oder MYSQL-Befehle selbst. Sicher genug, fand ich dieses in der MDB2-FAQ:
Dank an alle, die zur Verfügung gestellt nachdenklich Antworten.
InformationsquelleAutor davr
Erkenne ich diese Frage so ziemlich beantwortet und im Ruhestand, aber ich fand es während der Suche nach Antworten zu einer ähnlichen situation, und ich kann nicht widerstehen, warf meinen Hut in den ring.
Ohne zu wissen, was die NULL/"" Spalte bezieht, kann ich nicht wissen, wie man die wahre Bedeutung, ein leerer string. Nicht leerer string bedeutet etwas für sich (gerne, wenn ich überzeugt einen Richter, lassen Sie mich meinen Namen ändern, einfach nichts, ich würde mich wirklich irritiert, wenn mein name zeigte sich auf meinen Führerschein als NULL. Mein name wäre !
Jedoch die leere Zeichenkette (oder die leere oder das nichts, das ETWAS ist, nicht einfach das fehlen von etwas (wie NULL)) könnte auch einfach nur bedeuten "NICHT NULL" oder "Nichts, aber immer noch nicht Null". Sie könnte sogar gehen in die andere Richtung und lassen vermuten, dass die Abwesenheit der Wert NULL ist, macht es sogar etwas WENIGER als Null, denn zumindest die Null hat einen Namen können Sie laut sagen!
Mein Punkt ist, dass, wenn die Zeichenfolge leer ist, ist eine direkte Darstellung einiger Daten (wie name, oder, was ich bevorzuge eingefügt werden zwischen den zahlen in mein Telefon-Nummer, usw), dann Ihre Optionen sind entweder zu streiten, bis Sie wund für die legitime Nutzung der leer-string oder etwas verwenden, stellt eine leere Zeichenfolge ist nicht NULL (Wie ein ASCII-Zeichen oder unicode-äquivalent, ein regulärer Wert von einer Art, oder, noch schlimmer, eine beliebige noch völlig unbenutzten token, wie: ◘
Wenn die leere Zelle wirklich nur Mittel, die NICHT NULL ist, dann könnte man denken, eine andere Art es auszudrücken. Eine dumme und offensichtliche Weg ist der Satz "not NULL". Aber ich habe eine Ahnung, dass NULL bedeutet so etwas wie "Nicht Teil dieser Gruppe", während die leere Zeichenfolge bedeutet so etwas wie "dieser Typ ist cool, er ist gerade noch nicht bekommen seine gang-tattoos noch". In dem Fall würde ich kommen mit einem Begriff/Namen/Idee für diese situation, wie "Standard" oder "rookie" oder "Ausstehend".
Nun, wenn einige verrückte chance, dass Sie tatsächlich wollen, dass leere Zeichenfolge darstellen, die nicht einmal würdig NULL, wieder, kommen mit einer bedeutenden symbol für das, wie "-1" oder "SUPERNULL" oder "UGLIES".
In der indischen Kastensystem, der niedrigsten Kaste sind Shudra: die Bauern und die Arbeiter. Unterhalb dieser Kaste sind die Dalits: "Die Unbestechlichen". Sie sind nicht als eine niederen Kaste an, da Sie als die niedrigste Kaste betrachtet werden, eine Kontamination des gesamten Systems.
Also Nenn mich nicht verrückt zu denken, leere strings kann SCHLIMMER sein als NULL!
'Til next time.
InformationsquelleAutor Anthony
Ich die Lösung gefunden!
MDB2 wandelt leere Zeichenfolgen zu NULL, weil die Portabilität option MDB2_PORTABILITY_EMPTY_TO_NULL ist standardmäßig aktiviert (Dank Oracle die Auffassung, dass leere Zeichenfolgen als null sein).
Schalten Sie diese Optionen deaktivieren, wenn Sie eine Verbindung zu der Datenbank:
Oops 🙂 ich habe es nicht bemerkt.
InformationsquelleAutor ahhon
Während 0 und leere strings sind Variablen, die NULL ist das fehlen von Daten. Und glaubt mir, es ist viel einfacher, eine Abfrage schreiben, um
SELECT * from table where mything IS NULL
als zu versuchen, um eine Abfrage nach leeren Zeichenfolgen :/InformationsquelleAutor Lisa Simpson
Nicht eine leere Menge von Zitaten,
""
tun?das genau der Grund, warum ich sagte, es zu tun - er bemüht sich um eine NICHT-NULL-Wert in die db, die leeren Anführungszeichen sind
InformationsquelleAutor warren
Ich bin verwirrt. Wie es aussieht, bist du mit mysqli-OO (aus den tags und Stil), aber die syntax ist anders als die Handbuch auf php.net, die besagt, um dies zu tun, statt:
InformationsquelleAutor Powerlord