Codice errore 1292 - Valore DOUBLE errato troncato - Mysql


87

Non sono sicuro di cosa sia questo errore!

#1292 - Truncated incorrect DOUBLE value: 

Non ho campi o dati a doppio valore!

Ho sprecato un'intera ora cercando di capirlo!

ecco la mia domanda

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

ecco il mio spettacolo crea tabella per la tabella in cui stanno andando i risultati

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

8
Secondo questo bug report, il messaggio proviene dal confronto di una colonna di stringhe con un numero intero, perché entrambi vengono convertiti in doubleper il confronto. Come vengono ac.company_codee ta.company_codedichiarati?
Barmar

Vedi anche bugs.mysql.com/bug.php?id=46641 dove un poster suggeriva di riformulare questo messaggio di errore in "DOVE i confronti tra colonne numeriche e non numeriche non sono consentiti"
Barmar

Entrambe queste colonne sono int (11) e non stringhe!
Mike

Puoi creare uno sqlfiddle con alcuni dati di esempio?
Barmar

Risposte:


159

Questo messaggio significa che stai cercando di confrontare un numero e una stringa in una clausola WHEREor ON. Nella tua query, l'unico posto potenziale in cui potrebbe verificarsi è ON ac.company_code = ta.company_code; o assicurati che abbiano dichiarazioni simili o usa un esplicito CASTper convertire il numero in una stringa.

Se disattivi la strictmodalità, l'errore dovrebbe trasformarsi in un avviso.


1
Wow, che messaggio di errore fuorviante. Grazie dell'aiuto. Avevi ragione. Dovevo passare DB::table('contacts')->where('attendance', $int) ->update(["attendance" => $string]);aDB::table('contacts')->where('attendance', '' . $int) ->update(["attendance" => $string]);
Ryan

4
Grazie per questo. Per espandere: ci sono tutti i modi in cui questo può essere attivato. Nel mio caso, utilizzava un'espressione regolare per estrarre un numero intero da una stringa e confrontarlo con un numero intero. Stranamente, quando ho appena usato l'istruzione SELECT, è andato tutto bene: seleziona xxxx da t1 inner join t2 su t1.id = substr (value, locate (':', tagvalue) +1) Dopo averlo trasformato in un INSERT. ..SELECT, l'errore è stato attivato.
xgretsch

22

Ho corretto questo errore perché c'era un errore di sintassi o alcuni caratteri indesiderati nella query, ma MySQL non è stato in grado di rilevarlo. Stavo usando andtra più campi durante l'aggiornamento, ad es

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

Il problema nella query sopra può essere risolto sostituendolo andcon virgola ( ,)


Grazie, questo non è un grosso problema, ma a volte un piccolo problema diventa un grosso problema
Sumit Kumar Gupta

Grazie mille!!!! Questo è successo a me nel contesto di una dichiarazione di aggiornamento
KC Baltz

8

Stavo affrontando lo stesso problema. Tentativo di confrontare una colonna varchar (100) con numerico 1. Ha provocato l'errore 1292. Risolto aggiungendo virgolette singole intorno a 1 ('1').

Grazie per la spiegazione sopra


3

TL; DR

Ciò potrebbe anche essere causato dall'applicazione ORa colonne / valori letterali di stringa.

Versione completa

Ho ricevuto lo stesso messaggio di errore per una semplice INSERTistruzione che coinvolge una vista:

insert into t1 select * from v1

sebbene tutte le colonne di origine e di destinazione fossero di tipo VARCHAR. Dopo un po 'di debug, ho trovato la causa principale; la vista conteneva questo frammento:

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

che presumibilmente era il risultato di una conversione automatica del seguente frammento da Oracle:

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

( ||è la concatenazione di stringhe in Oracle). La soluzione era usare

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

anziché.


Grazie! Nuovo in MySQL, stavo concatenando usando il modo consentito da SQL Server, qualcosa come stringa1 + stringa2 + stringa3. Il tuo suggerimento della funzione concat ha risolto questo errore per me.
Marcy

1

Quando ho ricevuto questo errore, credo che fosse un bug, tuttavia dovresti tenere presente che se esegui una query separata con un'istruzione SELECT e la stessa clausola WHERE, puoi prendere gli ID primari da quell'istruzione SELECT SELECT CONCAT(primary_id, ','):) e inserire nella query UPDATE non riuscita con condizioni -> "WHERE [primary_id] IN ([elenco di ID primari separati da virgole dall'istruzione SELECT)" che consente di alleviare eventuali problemi causati dalla clausola WHERE della query originale (fallita).

Per me, personalmente, quando stavo usando le virgolette per i valori in "WHERE ____ IN ([values ​​here])", solo 10 delle 300 voci previste sono state interessate, il che, a mio parere, sembra un bug.


1

Ho visto un paio di casi in cui si verifica questo errore:

1. utilizzando l'operatore non uguale a !=in una whereclausola con un elenco di più orvalori

ad esempio:

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

Questo può essere risolto utilizzando

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

2. manca un operatore di confronto in una if()funzione:

select if(col1,col1,col2);

per selezionare il valore in col1se esiste e altrimenti mostrare il valore in col2... questo genera l'errore; può essere risolto utilizzando:

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

0

Nel mio caso era l'inserimento di una vista (altamente nidificata, vista in vista) che causava l'errore in :

CREATE TABLE tablename AS
  SELECT * FROM highly_nested_viewname
;

La soluzione alternativa che abbiamo finito per fare è stata simulare una vista materializzata (che è in realtà una tabella) e inserirla / aggiornarla periodicamente utilizzando procedure memorizzate.


0

Ha avuto questo problema con ES6 e TypeORM durante il tentativo di passare .where("order.id IN (:orders)", { orders }), dove ordersera una stringa di numeri separati da virgole. Quando ho convertito in un modello letterale, il problema è stato risolto.

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

0

Se hai utilizzato CHECK CONSTRAINT sulla tabella per la lunghezza del campo stringa

es: per controllare la lunghezza del nome utente> = 8

uso:

CHECK (CHAR_LENGTH(username)>=8)

invece di

CHECK (username>=8)

correggere il vincolo di controllo se qualcuno ha un confronto errato del tipo di dati


0

Se non hai un campo o dati a doppio valore, forse dovresti provare a disabilitare la modalità sql rigorosa.

Per farlo devi modificare il file " my.ini " che si trova nella cartella di installazione di MySQL, trovare la riga "Imposta la modalità SQL su strict" e modificare la riga seguente:

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

a questo, eliminando "STRICT_TRANS_TABLES"

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

Dopodiché, devi riavviare il servizio MySQL per abilitare questa modifica.

Per verificare la modifica, apri l'editor ed esegui questa frase sql:

SHOW VARIABLES LIKE 'sql_mode';

Molto importante : fai attenzione al formato del file dopo il salvataggio. Salvalo come "UTF8" e non come "TFT8 con BOM" perché il servizio non si riavvierà.


È più sicuro farlo per sessione, o meglio ancora solo nello script specifico che sta modificando le 'tabelle fastidiose': $pdo->query('SET SESSION SQL_MODE = "ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"')e dopo la magia del copione, torna rigorosamente allo stesso modo:$pdo->query('SET SESSION SQL_MODE = "STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"')
Piemol
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.