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

1voto

Kylan Hurt Points 23

Lorsque j'ai reçu cette erreur, j'ai cru qu'il s'agissait d'un bogue, mais il faut garder à l'esprit que si vous effectuez une requête distincte avec une instruction SELECT et la même clause WHERE, vous pouvez récupérer les ID primaires à partir de cette SELECT : SELECT CONCAT(primary_id, ',') ) et les insérer dans la requête UPDATE qui a échoué avec les conditions -> "WHERE [primary_id] IN ([liste des identifiants primaires séparés par des virgules de l'instruction SELECT)", ce qui vous permet d'atténuer les problèmes causés par la clause WHERE de la requête originale (qui a échoué).

Personnellement, lorsque j'utilisais des guillemets pour les valeurs dans le champ "WHERE ____ IN ([valeurs ici])", seules 10 des 300 entrées prévues étaient affectées, ce qui, à mon avis, ressemble à un bug.

1voto

Marc Points 31

Si vous n'avez pas de champ ou de données à double valeur, vous devriez peut-être essayer de désactiver le mode strict sql.

Pour ce faire, vous devez modifier " mon.ini "situé dans le dossier d'installation de MySQL, trouvez la ligne "Set the SQL mode to strict" et changez la ligne ci-dessous :

# Set the SQL mode to strict
sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

à ceci, en supprimant "STRICT_TRANS_TABLES"

# Set the SQL mode to strict
sql-mode="NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

Après cela, vous devez redémarrer le service MySQL pour activer ce changement.

Pour vérifier le changement, ouvrez l'éditeur et exécutez cette phrase sql :

SHOW VARIABLES LIKE 'sql_mode';

Très important : Faites attention au format du fichier après l'enregistrement. Sauvegardez-le en "UTF8" et non en "TFT8 avec BOM" car le service ne redémarrera pas.

0voto

Nae Points 5451

Dans mon cas, c'est l'insertion d'une vue (hautement imbriquée, vue dans une autre vue) qui a provoqué l'erreur dans le fichier mysql-5.6 :

CREATE TABLE tablename AS
  SELECT * FROM highly_nested_viewname
;

La solution que nous avons trouvée consiste à simuler une vue matérialisée (qui est en fait une table) et à l'insérer/mettre à jour périodiquement à l'aide de procédures stockées.

0voto

MDev20 Points 607

J'ai eu ce problème avec ES6 et TypeORM en essayant de passer .where("order.id IN (:orders)", { orders }) , donde orders était une chaîne de chiffres séparés par des virgules. Lorsque je l'ai converti en un modèle littéral, le problème a été résolu.

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

0voto

Varadhan Work Points 373

Si vous avez utilisé VÉRIFIER LA CONTRAINTE sur la table pour la longueur du champ de la chaîne

ex : pour vérifier la longueur du nom d'utilisateur >= 8

utiliser :

CHECK (CHAR_LENGTH(username)>=8)

au lieu de

CHECK (username>=8)

Correction de la contrainte de vérification si une comparaison de type de données est incorrecte.

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