Wenn die folgende SQL-Abfrage ausgeführt wird:
UPDATE shop_category
SET name = 'Secolul XVI - XVIII'
AND name_eng = '16th to 18th centuries'
WHERE category_id = 4768
Der folgende Fehler wird ausgelöst:
1292 - Truncated incorrect DOUBLE value: 'Secolul XVI - XVIII'
Wie kann ich das beheben?
shop_category
Tabellenstruktur:
category_id mediumint(8)
name varchar(250)
name_eng varchar(250)
Antworten:
Sie benötigen das
AND
Schlüsselwort nicht. Hier ist die korrekte Syntax der UPDATE-Anweisung :quelle
Ich habe diese Ausnahme nicht wegen UND anstelle von Komma erhalten, sondern weil ich in der where-Klausel keine Apostrophe verwendet habe.
Wie meine Anfrage war
Als ich die where-Klausel geändert habe,
where column2 in ('00012121');
hat die Abfrage für mich gut funktioniert.quelle
STRICT_TRANS_TABLES
eingerichtetsql_mode
und versucht, es zu aktualisieren, das mit einem numerischen Wert in derwhere
Klausel begrenzt war (was zu sein schien) , und warf einen Fehler auf. Beim Ändern des Modus wurde stattdessen eine Warnung ausgegeben, das Update wurde jedoch nicht angewendet. Bei näherer Betrachtung war die in der where-Klausel verwendete Spalte, obwohl sie nur scheinbar ganzzahlige Werte enthielt, tatsächlich einvarchar(20)
Versuchen Sie, das
AND
durch zu ersetzen,
Die UPDATE-Syntax zeigt, dass Komma als Trennzeichen verwendet werden sollte.
quelle
Was es im Grunde ist
Es ist eine falsche Syntax, die MySQL zu der Annahme veranlasst, dass Sie versuchen, etwas mit einer Spalte oder einem Parameter vom falschen Typ "DOUBLE" zu tun.
Lerne aus meinem Fehler
In meinem Fall habe ich die varchar-Spalte in einer Tabelleneinstellung aktualisiert, in der
NULL
der Wert0
stand. Meine Update-Abfrage war wie folgt:Nun, da der tatsächliche Typ von
myValue
ist,VARCHAR(255)
gibt dies die Warnung:Und jetzt
myTable
ist praktisch leer, dennmyValue
jetzt istNULL
für JEDE REIHE in der Tabelle! Wie ist es passiert?* inneres Schreien *
In über 30.000 Zeilen fehlen jetzt Daten.
* inneres Schreien verstärkt sich *
Gott sei Dank für Backups. Ich konnte alle Daten wiederherstellen.
* interne Schreiintensität sinkt *
Die korrigierte Abfrage lautet wie folgt:
Ich wünschte, dies wäre mehr als nur eine Warnung, daher ist es weniger gefährlich, diese Zitate zu vergessen.
* Internes Schreien beenden *
quelle
Ich habe gerade meine Zeit damit verschwendet und wollte einen zusätzlichen Fall hinzufügen, in dem dieser Fehler auftritt.
Testdaten
Das Problem ist
ORDER BY value1+0
- Typ Casting.Ich weiß, dass es die Frage nicht beantwortet, aber dies ist das erste Ergebnis bei Google für diesen Fehler und es sollte andere Beispiele geben, bei denen dieser Fehler auftritt.
quelle
Hauptsächlich ungültige Abfragezeichenfolgen geben diese Warnung aus.
Falsch aufgrund eines subtilen Syntaxfehlers (falsch platzierte rechte Klammer) bei Verwendung der
INSTR
Funktion:Richtig:
quelle
Es scheint, dass MySQL das Typ-Casting mit SELECT-Anweisungen elegant handhabt. Das Feld shop_id ist vom Typ varchar, aber die select-Anweisungen funktionieren
Aber wenn Sie versuchen, die Felder zu aktualisieren
Es schlägt mit Fehler fehl. Falscher DOUBLE-Wert abgeschnitten: '1t5hxq9'
Sie müssen die shop_id 26244317283 in Anführungszeichen '26244317283' setzen, damit die Abfrage funktioniert, da das Feld vom Typ varchar not int ist
quelle
Wenn Sie dieses Problem mit einer Beilage erhalten, die wie die folgende aussieht, kann das Problem einfach das Fehlen eines Leerzeichens zwischen
--
und dem Kommentartext sein:Das Problem dabei ist, dass das
--something
eigentlich-- something
mit einem Leerzeichen sein sollte.quelle
Bei der Verwendung von bindParam und der Angabe von PDO :: PARAM_INT, bei der ich tatsächlich eine Zeichenfolge übergeben habe, ist dieser Fehler aufgetreten. Der Wechsel zu PDO :: PARAM_STR hat den Fehler behoben.
quelle
Dieser Fehler trat auf, als ich versuchte, WHERE EXIST auszuführen, bei dem die Unterabfrage mit zwei Spalten übereinstimmte, die versehentlich unterschiedlichen Typ waren. Die beiden Tabellen waren auch unterschiedliche Speicher-Engines.
Eine Spalte war ein CHAR (90) und die andere war ein BIGINT (20).
Ein Tisch war InnoDB und der andere war MEMORY.
Teil der Abfrage:
Durch Ändern des Spaltentyps für eine Spalte von BIGINT in CHAR wurde das Problem behoben.
quelle