Ich bin nicht sicher, was ist dieser Fehler!
#1292 - Truncated incorrect DOUBLE value:
Ich habe kein Feld oder keine Daten mit doppeltem Wert!
Ich habe eine ganze Stunde damit verbracht, das herauszufinden!
Hier ist meine Anfrage
INSERT INTO call_managment_system.contact_numbers
(account_id, contact_number, contact_extension, main_number, created_by)
SELECT
ac.account_id,
REPLACE(REPLACE(REPLACE(REPLACE(ta.phone_number, '-', ''), ' ', ''), ')', ''),'(','') AS Phone,
IFNULL(ta.ext, '') AS extention,
'1' AS MainNumber,
'2' AS created_by
FROM
cvsnumbers AS ta
INNER JOIN accounts AS ac ON ac.company_code = ta.company_code
WHERE
LENGTH(REPLACE(REPLACE(REPLACE(REPLACE(ta.phone_number, '-', ''), ' ', ''), ')', ''),'(','') ) = 10
Hier ist meine Show-Create-Tabelle für die Tabelle, in die die Ergebnisse eingehen
CREATE TABLE `contact_numbers` (
`number_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`account_id` int(10) unsigned NOT NULL DEFAULT '0',
`person_id` int(11) NOT NULL DEFAULT '0',
`contact_number` char(15) NOT NULL,
`contact_extension` char(10) NOT NULL DEFAULT '',
`contact_type` enum('Primary','Direct','Cell','Fax','Home','Reception','Office','TollFree') NOT NULL DEFAULT 'Primary',
`contact_link` enum('Account','PDM','Other') NOT NULL DEFAULT 'Account',
`status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '0 = inactive, 1=active',
`main_number` tinyint(1) NOT NULL DEFAULT '0' COMMENT '1 = main phone number',
`created_on` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`created_by` int(11) NOT NULL,
`modified_on` datetime DEFAULT NULL,
`modified_by` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`number_id`),
KEY `account_id` (`account_id`),
KEY `person_id` (`person_id`)
) ENGINE=InnoDB AUTO_INCREMENT=534 DEFAULT CHARSET=utf8
double
für den Vergleich konvertiert werden . Wie werdenac.company_code
undta.company_code
deklariert?Antworten:
Diese Nachricht bedeutet, dass Sie versuchen, eine Zahl und eine Zeichenfolge in einer
WHERE
oderON
-Klausel zu vergleichen . In Ihrer Abfrage ist der einzige potenzielle Ort, an dem dies auftreten könnte, FolgendesON ac.company_code = ta.company_code
: Stellen Sie entweder sicher, dass sie ähnliche Deklarationen haben, oder verwenden Sie eine explizite AnweisungCAST
, um die Zahl in eine Zeichenfolge zu konvertieren.Wenn Sie den
strict
Modus ausschalten , sollte der Fehler zu einer Warnung werden.quelle
DB::table('contacts')->where('attendance', $int) ->update(["attendance" => $string]);
umDB::table('contacts')->where('attendance', '' . $int) ->update(["attendance" => $string]);
Ich habe diesen Fehler korrigiert, da die Abfrage einen Syntaxfehler oder einige unerwünschte Zeichen enthielt, MySQL ihn jedoch nicht abfangen konnte. Ich habe
and
während des Updates zwischen mehreren Feldern verwendet, zupdate user set token='lamblala', accessverion='dummy' and key='somekey' where user = 'myself'
Das Problem in der obigen Abfrage kann durch Ersetzen behoben werden
and
durch comma (,
)quelle
Ich stand vor dem gleichen Problem. Der Versuch, eine varchar (100) -Spalte mit der Zahl 1 zu vergleichen, führte zu dem Fehler 1292. Behoben durch Hinzufügen von einfachen Anführungszeichen um 1 ('1').
Danke für die obige Erklärung
quelle
TL; DR
Dies kann auch durch das Anwenden
OR
auf Zeichenfolgenspalten / Literale verursacht werden.Vollversion
Ich habe die gleiche Fehlermeldung für eine einfache
INSERT
Anweisung mit einer Ansicht erhalten:insert into t1 select * from v1
obwohl alle Quell- und Zielspalten vom Typ waren
VARCHAR
. Nach einigem Debuggen fand ich die Grundursache; Die Ansicht enthielt dieses Fragment:Dies war vermutlich das Ergebnis einer automatischen Konvertierung des folgenden Snippets von Oracle:
(
||
ist die Verkettung von Zeichenfolgen in Oracle). Die Lösung war zu verwendenstattdessen.
quelle
Als ich diesen Fehler erhielt, war es meines Erachtens ein Fehler. Beachten Sie jedoch, dass Sie bei einer separaten Abfrage mit einer SELECT-Anweisung und derselben WHERE-Klausel die primären IDs aus dieser SELECT-ID abrufen können:
SELECT CONCAT(primary_id, ',')
und einfügen können sie in die fehlgeschlagene UPDATE-Abfrage mit Bedingungen -> "WHERE [primary_id] IN ([Liste der durch Kommas getrennten primären IDs aus der SELECT-Anweisung)", mit der Sie alle Probleme beheben können, die durch die WHERE-Klausel der ursprünglichen (fehlgeschlagenen) Abfrage verursacht werden.Für mich persönlich waren nur 10 der 300 erwarteten Einträge betroffen, als ich Anführungszeichen für die Werte in "WHERE ____ IN ([Werte hier])" verwendete, was meiner Meinung nach wie ein Fehler erscheint.
quelle
Ich habe einige Fälle gesehen, in denen dieser Fehler auftritt:
1. Verwenden des Operators ungleich
!=
in einerwhere
Klausel mit einer Liste mehrereror
Wertesowie:
Dies kann mithilfe von behoben werden
2. Fehlen eines Vergleichsoperators in einer
if()
Funktion:select if(col1,col1,col2);
Um den Wert in auszuwählen,
col1
falls vorhanden, und andernfalls den Wert incol2
... anzuzeigen, wird der Fehler ausgegeben. Es kann gelöst werden mit:select if(col1!='',col1,col2);
quelle
In meinem Fall war es eine Einfügung einer Ansicht (stark verschachtelt, Ansicht in Ansicht), die den Fehler in verursachte MySQL-5.6::
CREATE TABLE tablename AS SELECT * FROM highly_nested_viewname ;
Die Problemumgehung bestand darin, eine materialisierte Ansicht (die eigentlich eine Tabelle ist) zu simulieren und sie mithilfe gespeicherter Prozeduren regelmäßig einzufügen / zu aktualisieren.
quelle
Hatte dieses Problem mit ES6 und TypeORM beim Übergeben
.where("order.id IN (:orders)", { orders })
, woorders
eine durch Kommas getrennte Folge von Zahlen war. Bei der Konvertierung in ein Vorlagenliteral wurde das Problem behoben.quelle
Wenn Sie CHECK CONSTRAINT für Tabelle für die Länge des Zeichenfolgenfelds verwendet haben
zB: um die Länge des Benutzernamens zu überprüfen> = 8
verwenden:
CHECK (CHAR_LENGTH(username)>=8)
Anstatt von
CHECK (username>=8)
Beheben Sie die Prüfbedingung, wenn ein falscher Datentypvergleich vorliegt
quelle
Wenn Sie kein Feld oder keine Daten mit doppeltem Wert haben, sollten Sie möglicherweise versuchen, den SQL-Strict-Modus zu deaktivieren.
Dazu müssen Sie die Datei " my.ini " im MySQL-Installationsordner bearbeiten, die Zeile "SQL-Modus auf streng setzen" suchen und die folgende Zeile ändern:
# Set the SQL mode to strict sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
Löschen dazu "STRICT_TRANS_TABLES"
# Set the SQL mode to strict sql-mode="NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
Danach müssen Sie den MySQL-Dienst neu starten , um diese Änderung zu aktivieren.
Um die Änderung zu überprüfen, öffnen Sie den Editor und führen Sie diesen SQL-Satz aus:
SHOW VARIABLES LIKE 'sql_mode';
Sehr wichtig : Achten Sie nach dem Speichern auf das Dateiformat. Speichern Sie es als "UTF8" und nicht als "TFT8 mit Stückliste", da der Dienst nicht neu gestartet wird.
quelle
$pdo->query('SET SESSION SQL_MODE = "ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"')
$pdo->query('SET SESSION SQL_MODE = "STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"')