2009-11-09 7 views
22

Ich baue eine PHP/MySQL-Anwendung und ich stoße auf ein Problem mit meiner erstellen und aktualisieren Abfrage. Ich habe 5 Spalten, die auf Typ eingestellt sind FLOAT, die auch als NULL-Spalten gesetzt werden.Ich plane, sie erst viel später im Workflow einzufügen.Was ist dieser Fehler? "Datenbankabfrage fehlgeschlagen: Daten abgeschnitten für Spalte 'Spaltenname' in Zeile 1

Allerdings muss ich neue Datensätze für diese Datenbank erstellen, und ich muss vorhandene Datensätze bearbeiten, ohne Ich benutze OOP PHP, das eine Standard save() Methode verwendet, die überprüft, ob eine ID im Objekt vorhanden ist, andernfalls create(), und wenn ja, ruft es update(). Es funktioniert sehr gut, normalerweise

Die Methoden update() und create() wurden entwickelt, um aus einem protected static $db_fields Attributarray zu extrahieren, das am Anfang jeder Klasse deklariert ist und alle Felder enthält, die in dieser Tabelle verwendet werden. update() und create() durchlaufen diese Array und entweder INSERT INTO oder UPDATE in SQL, entsprechend.

Mein Verständnis ist, dass, wenn Sie '' (zwei einfache Anführungszeichen, leer) verwenden, SQL diese INSERT INTO oder UPDATE Anfragen überspringt und sie als NULL belassen. Es gibt nicht einmal Formularfelder für diese 5 Float-Werte irgendwo auf der Seite, also wenn die Methoden laufen, werden die Werte natürlich '' sein.

Ist das der Grund, warum ich den Fehler "Daten gekürzt" bekomme? Es sieht anders aus - ich habe den abgeschnittenen Fehler noch nicht gesehen und deshalb komme ich zu euch Genies. Vielen Dank.

+0

Meine Ahnung ist, dass MySQL erwartet, dass Werte, die in ein FLOAT-Feld geschrieben werden, mindestens numerisch oder NULL sind. Haben Sie versucht, NULL anstelle von '' zu verwenden? – jkndrkn

Antwort

29

'' und null sind nicht gleich. Wenn sich Ihr mysql-server im strikten Modus befindet, wird er die Einfügung verweigern, da Sie ungültige Daten für die Spalte übergeben haben. Ohne strikten Modus gibt es eine Warnung aus.

mysql> create table a (a float not null); 
Query OK, 0 rows affected (0.11 sec) 

mysql> insert a values (''); 
Query OK, 1 row affected, 1 warning (0.05 sec) 

mysql> show warnings; 
+---------+------+----------------------------------------+ 
| Level | Code | Message        | 
+---------+------+----------------------------------------+ 
| Warning | 1265 | Data truncated for column 'a' at row 1 | 
+---------+------+----------------------------------------+ 
1 row in set (0.00 sec) 

mysql> set sql_mode = 'STRICT_ALL_TABLES'; 
Query OK, 0 rows affected (0.02 sec) 

mysql> insert a values (''); 
ERROR 1265 (01000): Data truncated for column 'a' at row 1 

entweder einfügen explizite null s, oder nicht einmal die Spalte im Einsatz angeben.

Wenn Sie aktualisieren, können Sie alle Werte senden, die Sie haben, da mysql die unveränderten ignoriert.

+0

Ja, ich kann sehen, dass ich das tun muss. Aber mit UPDATE kann es nicht wirklich wahr sein, weil Sie oft ein Formular haben, das alle Spalten des Datensatzes hat, aber Sie nur ein oder zwei aktualisieren, und die Anwendung nicht weiß, welche geändert wurden, so aktualisiert sie alle, etc Was mich interessiert ist - woher kommt der TRUNCATED Fehler? – rhodesjason

+0

siehe mein aktuelles Beispiel. Der truncate-Fehler ist mysql, das besagt, dass die Zeichenfolge der Länge null, die Sie übergeben haben, nicht in einen richtigen numerischen Wert konvertiert werden konnte. – longneck

+0

Gut, das ist es, was ich hören musste - es ist nur ein Problem beim Einfügen und nicht beim Update. Ich habe mir Sorgen gemacht! Vielen Dank. – rhodesjason

1

Wenn Sie nicht die Daten einfügen, sollte es nicht in der SQL-Anweisung sein.

Als Beispiel, sagen Sie haben eine Tabelle "Data" mit ID, float1, float2, float3 und float4, Float5, von denen Sie nur die ID hinzufügen. Die INSERT sollte wie folgt aussehen:

INSERT INTO `Data` (`id`) 
VALUES ('Some-ID-Value') 

Wenn der Schwimmer NULL akzeptieren definiert werden sie NULL vorbelegt werden. Das Gleiche gilt für UPDATE-Anweisungen. Sie sollten nur die Felder auflisten, die Sie ändern möchten.

1

Dies ist nicht als Lösung gemeint, sondern vielleicht nur, um das Problem etwas genauer zu beleuchten.

Wenn Sie der Anweisung das Schlüsselwort IGNORE hinzufügen und versuchen, '' (oder eine beliebige Zeichenfolge, die nicht mit einer Zahl beginnt) in eine Float-Spalte einzufügen, fügt MySQL den Wert 0 anstelle des Standardwerts ein.

INSERT IGNORE INTO a_table (float_column) VALUE ('') 

INSERT IGNORE INTO a_table (float_column) VALUE ('abc') 

Beide fügen 0 ein, auch wenn der Standardwert null ist. Ohne IGNORE werden natürlich beide Anweisungen den Fehler, den Sie sehen, auslösen.

Kurz gesagt, erhalten Sie die Nachricht, weil die Daten, die Sie liefern, weder der erwartete Typ noch der Standardwert sind.

Verwandte Themen