125 votes

Code d'erreur 1292 - Valeur DOUBLE incorrecte tronquée - Mysql

Je ne suis pas sûr de l'origine de cette erreur !

#1292 - Truncated incorrect DOUBLE value: 

Je n'ai pas de champ de valeur double ou de données !

J'ai perdu une heure entière à essayer de résoudre ce problème !

Voici ma question

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

Voici mon tableau de création de spectacle pour la table dans laquelle les résultats vont aller.

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

218voto

Barmar Points 135986

Ce message signifie que vous essayez de comparer un nombre et une chaîne de caractères dans un fichier de type WHERE o ON clause. Dans votre requête, le seul endroit potentiel où cela pourrait se produire est ON ac.company_code = ta.company_code ; soit s'assurer qu'ils ont des déclarations similaires, soit utiliser une déclaration explicite de CAST pour convertir le nombre en une chaîne de caractères.

Si vous éteignez strict l'erreur devrait se transformer en avertissement.

38voto

user1926248 Points 351

J'ai corrigé cette erreur car il y avait une erreur de syntaxe ou des caractères indésirables dans la requête, mais MySQL n'a pas été en mesure de l'attraper. J'utilisais and entre plusieurs champs pendant la mise à jour, par exemple

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

Le problème dans la requête ci-dessus peut être résolu en remplaçant and avec virgule( , )

15voto

ForeverLearner Points 675

J'étais confronté au même problème. J'essaie de comparer une colonne varchar(100) avec une colonne numérique 1. Cela a donné lieu à l'erreur 1292. Corrigé en ajoutant des guillemets simples autour de 1 ('1').

Merci pour l'explication ci-dessus

6voto

Frank Schmitt Points 13554

TL ; DR

Cela peut également être dû à l'application OR aux colonnes / littéraux de chaînes de caractères.

Version complète

J'ai obtenu le même message d'erreur pour un simple INSERT impliquant une vue :

insert into t1 select * from v1

bien que toutes les colonnes source et cible soient de type VARCHAR . Après quelques débogages, j'ai trouvé la cause première ; la vue contenait ce fragment :

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

qui était vraisemblablement le résultat d'une conversion automatique de l'extrait suivant d'Oracle :

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

( || est la concaténation de chaînes de caractères dans Oracle). La solution consistait à utiliser

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

à la place.

4voto

enharmonic Points 809

J'ai vu quelques cas où cette erreur se produit :

1. en utilisant l'opérateur non égal != dans un where avec une liste de plusieurs or valeurs

comme :

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

Ce problème peut être résolu en utilisant

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

2. l'absence d'un opérateur de comparaison dans un if() fonction :

select if(col1,col1,col2);

afin de sélectionner la valeur dans col1 s'il existe et sinon, afficher la valeur dans col2 ...cela provoque l'erreur ; elle peut être résolue en utilisant :

select if(col1!='',col1,col2);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X