Valor DOUBLE incorreto truncado do MYSQL

155

Quando a consulta SQL abaixo é executada:

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

O seguinte erro é gerado:

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

Como consertar isto?


shop_category estrutura da tabela:

category_id   mediumint(8)
name        varchar(250)
name_eng      varchar(250)
Emanuel
fonte
1
É de alguma forma determinável qual é o verdadeiro significado dessa mensagem de erro e em quais casos ela aparece? Como ocorre em contextos em que um valor DUPLO não está envolvido, parece um pouco enganador.
syck 28/03
Acho que ele tenta calcular o valor BOOLEAN de 'Secolul XVI - XVIII' antes de AND.
precisa saber é o seguinte
1
Se você tiver "onde x = 'x' e y", receberá esse erro mal concebido e obscuro
Johan Snowgoose

Respostas:

214

Você não precisa da ANDpalavra - chave. Aqui está a sintaxe correta da instrução UPDATE :

UPDATE 
    shop_category 
SET 
    name = 'Secolul XVI - XVIII', 
    name_eng = '16th to 18th centuries' 
WHERE 
    category_id = 4768
Darin Dimitrov
fonte
12
Realmente feliz que eu encontrei esta resposta antes de jogar o computador para uma parede
rbennell
19
assim definitivamente estupidez por parte de pessoas como eu cometer esse erro, no entanto, 'truncado duplo valor incorreto' é uma mensagem de aviso bastante inútil ...
rbennell
6
Basicamente, sempre que há algum problema Sintaxe ele lança esta exceção inútil "truncado-mysql-incorreta-double-value"
heman123
Sim ... também tive uma experiência semelhante ao tentar usar uma string literal na cláusula 'where' sem usar aspas.
Pranay
Eu estava prestes a cometer suicídio por causa disso. Graças a Deus você salvou minha vida. Este estúpido e em atualização. 😠🤣
gauravmehla 30/06
72

Eu estava recebendo essa exceção não por causa de AND em vez de vírgula; na verdade, eu estava tendo essa exceção apenas porque não estava usando apóstrofos na cláusula where.

Como minha consulta foi

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

quando mudei a cláusula where where column2 in ('00012121');, a consulta funcionou bem para mim.

Sidra
fonte
2
O mesmo problema para mim! Eu estava tentando atualizar uma tabela em um CRM que usa 1 como o ID do usuário administrador e 36 guias de char para todos os outros usuários. Meu local estava especificando o user_id como 1, sem as aspas. Eu acho que isso está relacionado ao mysql estar no modo estrito.
dmulvi
3
@danny_mulvihill Eu acredito que você está no caminho certo. Eu havia STRICT_TRANS_TABLESdefinido sql_modee tentar atualizar um campo limitado com (o que parecia ser) um valor numérico na wherecláusula gerou um erro. Ao mudar de modo, lançou um aviso, mas ainda não aplicou a atualização. Após uma inspeção mais próxima, a coluna usada na cláusula onde, apesar de só ter o que parecia ser valores inteiros, foi realmente umvarchar(20)
Robert Gannon
O mesmo problema para mim. Um 'select * from t onde id = 6503' funcionou bem, mas 'update t set a = "foo" where id = 6503' resultou em ERRO 1292 (22007): Valor DOUBLE incorreto truncado: '234805557438 #'. id parece inteiro, mas era um varchar. A citação do valor na atualização resolveu o problema. 'update t set a = "foo" where id = "6503"'
gaoithe
O mesmo problema para mim ao passar um INSERT que estava funcionando no console mysql, mas não estava funcionando no software Pentaho Data Integration. Alterou "nome> 1000 e nome <6000" para "nome> '1000' e nome <'6000'" e funcionou como um encanto.
Sawd
13

Tente substituir o ANDpor,

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

A sintaxe UPDATE mostra que vírgula deve ser usada como separador.

codaddict
fonte
1
Trabalhou para mim +1 para ele :)
Faisal
12

O que basicamente é

É uma sintaxe incorreta que faz com que o MySQL pense que você está tentando fazer algo com uma coluna ou parâmetro com o tipo incorreto "DOUBLE".

Aprenda com o meu erro

No meu caso, atualizei a coluna varchar em uma configuração de tabela em NULLque o valor 0estava. Minha consulta de atualização foi assim:

UPDATE myTable SET myValue = NULL WHERE myValue = 0;

Agora, já que o tipo real de myValueis VARCHAR(255)é o seguinte:

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

E agora myTableestá praticamente vazio, porque myValueagora está NULLpara CADA LINHA na mesa! Como isso aconteceu?
* gritos internos *

Mais de 30 mil linhas agora têm dados ausentes.
* gritos internos se intensificam *

Graças a Deus por backups. Consegui recuperar todos os dados.
* Intensidade gritante interna diminui *

A consulta corrigida é a seguinte:

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

Eu gostaria que isso fosse mais do que apenas um aviso, por isso é menos perigoso esquecer essas citações.

* Fim da gritaria interna *

halfpastfour.am
fonte
1
Você pode definir uma opção para falhar nos avisos - consulte stackoverflow.com/a/4289242/1488762
Roger Dueck 30/01
5

Acabei de perder meu tempo com isso e queria adicionar um caso adicional em que esse erro se apresente.

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

Dados de teste

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

O problema é ORDER BY value1+0- conversão de tipo.

Eu sei que ele não responde à pergunta, mas este é o primeiro resultado no Google para esse erro e deve ter outros exemplos em que esse erro se apresenta.

hrvoj3e
fonte
4

As cadeias de consulta principalmente inválidas darão esse aviso.

Errado devido a um erro sutil de sintaxe (parêntese direito incorreto) ao usar a INSTRfunção:

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

Corrigir:

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

Parece que o mysql lida com a conversão de tipos normalmente com as instruções SELECT. O campo shop_id é do tipo varchar, mas as instruções select funcionam

select * from shops where shop_id = 26244317283;

Mas quando você tenta atualizar os campos

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

Falha com erro Valor DOUBLE incorreto truncado: '1t5hxq9'

Você precisa colocar o shop_id 26244317283 entre aspas '26244317283' para que a consulta funcione, pois o campo é do tipo varchar, não int

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

Se você estiver tendo esse problema com uma inserção semelhante à abaixo, o problema pode ser simplesmente a falta de espaço entre --o texto do comentário e o seguinte:

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

O problema disso é que, na --somethingverdade, deve ser-- something .

Joe Phillips
fonte
0

Eu experimentei esse erro ao usar o bindParam e especificando PDO :: PARAM_INT onde estava passando uma string. Mudar para PDO :: PARAM_STR corrigiu o erro.

Bytech
fonte
0

Eu experimentei esse erro quando tentei fazer um WHERE EXIST em que a subconsulta correspondia a 2 colunas que eram tipos diferentes de forma acidental. As duas tabelas também eram diferentes mecanismos de armazenamento.

Uma coluna era um CHAR (90) e a outra era um BIGINT (20).

Uma tabela era o InnoDB e a outra era MEMORY.

Parte da consulta:

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

A alteração do tipo de coluna na coluna de BIGINT para CHAR resolveu o problema.

thephper
fonte