Fehlercode 1292 - Falscher DOUBLE-Wert abgeschnitten - MySQL

85

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
Mike
quelle
7
Laut diesem Fehlerbericht stammt die Nachricht aus dem Vergleich einer Zeichenfolgenspalte mit einer Ganzzahl, da beide doublefür den Vergleich konvertiert werden . Wie werden ac.company_codeund ta.company_codedeklariert?
Barmar
Siehe auch bugs.mysql.com/bug.php?id=46641, wo ein Poster vorschlug, diese Fehlermeldung in "WO Vergleiche zwischen numerischen und nicht numerischen Spalten nicht zulässig sind"
umzuformulieren
Beide Spalten sind int (11) und keine Strings!
Mike
Können Sie mit einigen Beispieldaten eine SQLfiddle erstellen?
Barmar

Antworten:

157

Diese Nachricht bedeutet, dass Sie versuchen, eine Zahl und eine Zeichenfolge in einer WHEREoder ON-Klausel zu vergleichen . In Ihrer Abfrage ist der einzige potenzielle Ort, an dem dies auftreten könnte, Folgendes ON ac.company_code = ta.company_code: Stellen Sie entweder sicher, dass sie ähnliche Deklarationen haben, oder verwenden Sie eine explizite Anweisung CAST, um die Zahl in eine Zeichenfolge zu konvertieren.

Wenn Sie den strictModus ausschalten , sollte der Fehler zu einer Warnung werden.

Barmar
quelle
1
Wow, was für eine irreführende Fehlermeldung. Danke fürs Helfen. Du hattest Recht. Ich brauchte zu ändern , DB::table('contacts')->where('attendance', $int) ->update(["attendance" => $string]);umDB::table('contacts')->where('attendance', '' . $int) ->update(["attendance" => $string]);
Ryan
4
Danke dafür. Zum Erweitern: Es gibt viele Möglichkeiten, wie dies ausgelöst werden kann. In meinem Fall wurde ein regulärer Ausdruck verwendet, um eine Ganzzahl aus einer Zeichenfolge zu extrahieren und diese mit einer Ganzzahl zu vergleichen. Seltsamerweise war alles in Ordnung, als ich gerade die SELECT-Anweisung verwendet habe: Wählen Sie xxxx aus t1 inner join t2 auf t1.id = substr (Wert, lokalisieren (':', Tagwert) +1), nachdem ich daraus ein INSERT gemacht habe. ..SELECT, der Fehler wurde ausgelöst.
Xgretsch
22

Ich habe diesen Fehler korrigiert, da die Abfrage einen Syntaxfehler oder einige unerwünschte Zeichen enthielt, MySQL ihn jedoch nicht abfangen konnte. Ich habe andwährend des Updates zwischen mehreren Feldern verwendet, z

update 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 ( ,)

user1926248
quelle
Vielen Dank, dies ist kein großes Problem, aber manchmal wird aus einem kleinen Problem ein großes Problem
Sumit Kumar Gupta
Ich danke dir sehr!!!! Dies geschah mir im Rahmen einer Update-Erklärung
KC Baltz
8

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

ForeverLearner
quelle
3

TL; DR

Dies kann auch durch das Anwenden ORauf Zeichenfolgenspalten / Literale verursacht werden.

Vollversion

Ich habe die gleiche Fehlermeldung für eine einfache INSERTAnweisung 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:

string_col1 OR '_' OR string_col2 OR '_' OR string_col3

Dies war vermutlich das Ergebnis einer automatischen Konvertierung des folgenden Snippets von Oracle:

string_col1 || '_' || string_col2 || '_' || string_col3

( ||ist die Verkettung von Zeichenfolgen in Oracle). Die Lösung war zu verwenden

concat(string_col1, '_', string_col2, '_', string_col3)

stattdessen.

Frank Schmitt
quelle
Vielen Dank! Neu in MySQL war die Verkettung mit dem von SQL Server zugelassenen Weg, so etwas wie string1 + string2 + string3. Ihr Vorschlag für die Concat-Funktion hat diesen Fehler für mich behoben.
Marcy
1

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.

Kylan verletzt
quelle
1

Ich habe einige Fälle gesehen, in denen dieser Fehler auftritt:

1. Verwenden des Operators ungleich !=in einer whereKlausel mit einer Liste mehrerer orWerte

sowie:

where columnName !=('A'||'B')

Dies kann mithilfe von behoben werden

where columnName not in ('A','B')

2. Fehlen eines Vergleichsoperators in einer if()Funktion:

select if(col1,col1,col2);

Um den Wert in auszuwählen, col1falls vorhanden, und andernfalls den Wert in col2... anzuzeigen, wird der Fehler ausgegeben. Es kann gelöst werden mit:

select if(col1!='',col1,col2);
Enharmonic
quelle
0

In meinem Fall war es eine Einfügung einer Ansicht (stark verschachtelt, Ansicht in Ansicht), die den Fehler in verursachte ::

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.

Nae
quelle
0

Hatte dieses Problem mit ES6 und TypeORM beim Übergeben .where("order.id IN (:orders)", { orders }), wo orderseine durch Kommas getrennte Folge von Zahlen war. Bei der Konvertierung in ein Vorlagenliteral wurde das Problem behoben.

.where(`order.id IN (${orders})`);
mdawsondev
quelle
0

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

Varadhan Arbeit
quelle
0

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.

Marc
quelle
Es ist sicherer, dies pro Sitzung zu tun, oder noch besser nur in dem spezifischen Skript, das die 'lästigen Tabellen' $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"')
ändert