2013-04-17 14 views
29

Ich bin mir nicht sicher, was ist dieser Fehler!Fehlercode 1292 - abgeschnitten falschen DOUBLE-Wert - Mysql

#1292 - Truncated incorrect DOUBLE value: 

Ich habe keinen doppelten Wert Feld oder Daten!

Ich habe eine ganze Stunde verschwendet, um das herauszufinden!

hier ist meine Abfrage

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-Tabelle für die Tabelle erstellen, die die Ergebnisse in gehen

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 
+2

Laut [dieser Fehlerbericht] (http://bugs.mysql.com/bug.php?id=63112) kommt die Nachricht aus dem Vergleich einer String-Spalte mit einer Ganzzahl, weil beide in 'double' konvertiert werden für den Vergleich. Wie werden 'ac.company_code' und' ta.company_code' deklariert? – Barmar

+0

Siehe auch http://bugs.mysql.com/bug.php?id=46641, wo ein Poster vorgeschlagen hat, dass diese Fehlermeldung in "WHERE Vergleiche zwischen numerischen und nicht numerischen Spalten sind nicht zulässig" umformuliert werden – Barmar

+0

Beide dieser Spalten sind int (11) und keine Strings! – Mike

Antwort

63

Diese Meldung bedeutet, Sie versuchen, eine Zahl und ein vergleichen Zeichenkette in einem WHERE oder ON Klausel. In Ihrer Abfrage ist der einzige potentielle Ort, an dem das auftreten könnte, ON ac.company_code = ta.company_code; entweder stellen Sie sicher, dass sie ähnliche Deklarationen haben, oder verwenden Sie eine explizite CAST, um die Zahl in eine Zeichenfolge zu konvertieren.

Wenn Sie den Modus strict deaktivieren, sollte der Fehler in eine Warnung umgewandelt werden.

+0

Wow, was für eine irreführende Fehlermeldung. Danke fürs Helfen. Du hattest Recht. Ich musste 'DB :: table ('Kontakte') ändern -> where ('Anwesenheit', $ int) -> update ([" Teilnahme "=> $ string]);' zu 'DB :: table (' Kontakte ') -> where (' Anwesenheit ','. $ int) -> update (["Anwesenheit" => $ string]); ' – Ryan

3

Ich war mit dem gleichen Problem konfrontiert. Versucht, eine varchar (100) -Spalte mit einer numerischen 1 zu vergleichen. Ergibt sich im 1292-Fehler. Korrigiert durch Hinzufügen von einfachen Anführungszeichen um 1 ('1').

Danke für die Erklärung über

1

Wenn ich diesen Fehler empfangen Ich glaube, es ist ein Fehler war, aber Sie sollten bedenken, dass, wenn Sie eine separate Abfrage mit einer SELECT-Anweisung zu tun und die gleiche Klausel WHERE Sie dann kann die primären IDs aus der Anweisung SELECT: SELECT CONCAT(primary_id, ',')) abrufen und sie in die fehlgeschlagene UPDATE-Abfrage mit den Bedingungen einfügen -> "WHERE [primary_id] IN ([Liste kommagetrennter primärer IDs aus der SELECT-Anweisung)], die Sie lindern können Alle Probleme, die durch die WHERE-Klausel der ursprünglichen (fehlgeschlagenen) Abfrage verursacht werden.

Für mich persönlich, als ich Zitate für die Werte in der "WHERE ____ IN ([Werte hier]]" verwendete, waren nur 10 der 300 erwarteten Einträge betroffen, was meiner Meinung nach wie ein scheint Fehler.

3

Ich korrigierte diesen Fehler, da es einen Syntaxfehler oder einige unerwünschte Zeichen in der Abfrage gab, aber MySQL konnte es nicht abfangen. Ich verwendete and zwischen mehreren Feldern während der Aktualisierung, z.

update user 
set token='lamblala', 
    accessverion='dummy' and 
    key='somekey' 
where user = 'myself' 

Das Problem in obiger Abfrage kann durch das Ersetzen and mit Komma (,)

0

TL aufgelöst werden; DR

Dies kann auch durch die Anwendung OR auf String Spalten/Literale verursacht werden.

Vollversion

bekam ich die gleiche Fehlermeldung für eine einfache INSERT Aussage eine Ansicht beteiligt: ​​

insert into t1 select * from v1 

obwohl die alle Quell- und Zielspalten des Typs VARCHAR waren.Nach einigem Debugging habe ich die Ursache gefunden; die Ansicht enthielt dieses Fragment:

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

die vermutlich das Ergebnis einer automatischen Umwandlung des folgenden Ausschnitt aus Oracle war:

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

(|| ist String-Verkettung in Oracle). Die Lösung bestand darin, stattdessen

zu verwenden.

Verwandte Themen