MYSQL Troncato valore DOUBLE errato


155

Quando viene eseguita la query SQL di seguito:

UPDATE shop_category 
SET name = 'Secolul XVI - XVIII' 
    AND name_eng = '16th to 18th centuries' 
WHERE category_id = 4768

Viene generato il seguente errore:

1292 - Truncated incorrect DOUBLE value: 'Secolul XVI - XVIII'

Come risolvere questo?


shop_category struttura del tavolo:

category_id   mediumint(8)
name        varchar(250)
name_eng      varchar(250)

1
È in qualche modo determinabile quale sia il vero significato di questo messaggio di errore e in quali casi si presenta? Dal momento che si verifica in contesti in cui non è coinvolto un valore DOPPIO, sembra in qualche modo fuorviante.
Syck

Immagino che provi a calcolare il valore BOOLEANO di 'Secolul XVI - XVIII' prima di AND.
Anton Kolyaev,

1
Se hai "dove x = 'x' e y" otterrai questo errore mal concepito e oscuro
Johan Snowgoose,

Risposte:


214

Non hai bisogno della ANDparola chiave. Ecco la sintassi corretta dell'istruzione UPDATE :

UPDATE 
    shop_category 
SET 
    name = 'Secolul XVI - XVIII', 
    name_eng = '16th to 18th centuries' 
WHERE 
    category_id = 4768

12
Sono davvero contento di aver trovato questa risposta prima di gettare il computer contro un muro
Rbennell,

19
così definitivamente la stupidità da parte di gente come me che fanno questo errore, tuttavia, 'troncato valore DOUBLE errato' è un messaggio di avviso abbastanza inutile ...
rbennell

6
Fondamentalmente ogni volta che c'è qualche problema di sintassi genera questa inutile eccezione "mysql-truncated-errato-double-value"
heman123

Sì, anch'io ho avuto un'esperienza simile mentre cercavo di usare una stringa letterale nella clausola 'where' senza le virgolette.
martedì

Stavo per suicidarmi per questo. Grazie a Dio mi hai salvato la vita. Questo stupido E in aggiornamento. 😠🤣
gauravmehla il

72

Stavo ottenendo questa eccezione non a causa di AND invece della virgola, in realtà avevo questa eccezione solo perché non stavo usando gli apostrofi nella clausola where.

Come la mia domanda era

update table set coulmn1='something' where column2 in (00012121);

quando ho cambiato la clausola where in where column2 in ('00012121');allora la query ha funzionato bene per me.


2
Lo stesso problema per me! Stavo cercando di aggiornare una tabella in un crm che utilizza 1 come ID utente dell'utente admin e 36 guide caratteri per tutti gli altri utenti. Il mio dove era specificare user_id come 1, senza virgolette. Penso che questo sia legato al fatto che mysql sia in modalità rigorosa.
dmulvi,

3
@danny_mulvihill Credo che tu sia sulla buona strada. Avevo STRICT_TRANS_TABLESimpostato sql_modee tentando di aggiornare un campo limitato con (quello che sembrava essere) un valore numerico nella whereclausola ha generato un errore. Cambiando modalità, ha invece lanciato un avviso, ma non ha ancora applicato l'aggiornamento. A un esame più attento, la colonna utilizzata nella clausola where, nonostante avesse solo quelli che sembravano valori interi, era in realtà unvarchar(20)
Robert Gannon,

Lo stesso problema per me. A 'select * from t dove id = 6503' ha funzionato bene ma 'update t ha impostato a = "pippo" dove id = 6503' ha dato come risultato ERRORE 1292 (22007): Troncato errato valore DOPPIO: '234805557438 #'. id sembra intero ma era un varchar. Citando il valore nell'aggiornamento risolto il problema. 'update t set a = "foo" dove id = "6503"'
gaoithe

Lo stesso problema per me quando si passa a un INSERT che funzionava nella console mysql ma non funzionava nel software Pentaho Data Integration. Modificato "nome> 1000 e nome <6000" in "nome> '1000' e nome <'6000'" e funzionava come un incantesimo.
Visto il

13

Prova a sostituire il ANDcon,

UPDATE shop_category 
SET name = 'Secolul XVI - XVIII', name_eng = '16th to 18th centuries' 
WHERE category_id = 4768

La sintassi UPDATE mostra che la virgola deve essere utilizzata come separatore.


1
Ha funzionato per me +1 per questo :)
Faisal,

12

Di cosa si tratta fondamentalmente

È una sintassi errata che fa pensare a MySQL che stai provando a fare qualcosa con una colonna o un parametro che ha il tipo errato "DOUBLE".

Impara dal mio errore

Nel mio caso ho aggiornato la colonna varchar in un'impostazione della tabella in NULLcui si trovava il valore 0. La mia query di aggiornamento era così:

UPDATE myTable SET myValue = NULL WHERE myValue = 0;

Ora, poiché il tipo effettivo di myValueè VARCHAR(255)questo dà l'avvertimento:

+---------+------+-----------------------------------------------+
| Level   | Code | Message                                       |
+---------+------+-----------------------------------------------+
| Warning | 1292 | Truncated incorrect DOUBLE value: 'value xyz' |
+---------+------+-----------------------------------------------+

E ora myTableè praticamente vuoto, perché myValueora è NULLper OGNI FILA nella tabella! Come è successo?
* urla interna *

Oltre 30k righe ora hanno dati mancanti.
* le urla interne si intensificano *

Grazie al cielo per i backup. Sono stato in grado di recuperare tutti i dati.
* l'intensità dell'urlo interno diminuisce *

La query corretta è la seguente:

UPDATE myTable SET myValue = NULL WHERE myValue = '0';
                                                  ^^^
                                                  Quotation here!

Vorrei che questo non fosse solo un avvertimento, quindi è meno pericoloso dimenticare quelle citazioni.

* Fine urla interna *


1
È possibile impostare un'opzione per il fallimento degli avvisi - consultare stackoverflow.com/a/4289242/1488762
Roger Dueck,

5

Ho appena perso il mio tempo su questo e volevo aggiungere un altro caso in cui questo errore si presenta.

SQL Error (1292): Truncated incorrect DOUBLE value: 'N0003'

Dati di test

CREATE TABLE `table1 ` (
    `value1` VARCHAR(50) NOT NULL 
);
INSERT INTO table1 (value1) VALUES ('N0003');

CREATE TABLE `table2 ` (
    `value2` VARCHAR(50) NOT NULL 
);

INSERT INTO table2 (value2)
SELECT value1
FROM table1
WHERE 1
ORDER BY value1+0

Il problema è ORDER BY value1+0: digitare il casting.

So che non risponde alla domanda, ma questo è il primo risultato su Google per questo errore e dovrebbe avere altri esempi in cui questo errore si presenta.


4

Stringhe di query principalmente non valide daranno questo avviso.

Sbagliato a causa di un errore di sintassi sottile (parentesi destra posizionata male) quando si utilizza la INSTRfunzione:

INSERT INTO users (user_name) SELECT name FROM site_users WHERE
INSTR(status, 'active'>0);

Corretta:

INSERT INTO users (user_name) SELECT name FROM site_users WHERE
INSTR(status, 'active')>0;

2

Sembra che mysql gestisca il tipo cast con garbo con le istruzioni SELECT. Il campo shop_id è di tipo varchar ma le istruzioni select funzionano

select * from shops where shop_id = 26244317283;

Ma quando provi ad aggiornare i campi

update stores set store_url = 'https://test-url.com' where shop_id = 26244317283;

Fallisce con errore Troncato errato valore DOPPIO: '1t5hxq9'

Devi inserire lo shop_id 26244317283 tra virgolette '26244317283' affinché la query funzioni poiché il campo è di tipo varchar non int

update stores set store_url = 'https://test-url.com' where shop_id = '26244317283';

0

Se stai riscontrando questo problema con un inserto simile a quello sotto, il problema potrebbe essere semplicemente la mancanza di uno spazio tra --e il testo del commento:

insert into myTable (a, b, c)
values (
   123 --something
  ,345 --something else
  ,567 --something something else
);

Il problema è che in --somethingrealtà dovrebbe essere -- somethingcon uno spazio.


0

Ho riscontrato questo errore durante l'utilizzo di bindParam e quando ho specificato PDO :: PARAM_INT dove stavo effettivamente passando una stringa. Il passaggio a PDO :: PARAM_STR ha corretto l'errore.


0

Ho riscontrato questo errore quando ho provato a fare un WHERE EXIST in cui la sottoquery corrispondeva a 2 colonne che per errore erano tipi diversi. I due tavoli erano anche diversi motori di archiviazione.

Una colonna era un CHAR (90) e l'altra era un BIGINT (20).

Una tabella era InnoDB e l'altra era MEMORIA.

Parte della query:

[...] AND EXISTS (select objectid from temp_objectids where temp_objectids.objectid = items_raw.objectid );

La modifica del tipo di colonna su una colonna da BIGINT a CHAR ha risolto il problema.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.