Código de erro 1292 - valor DOUBLE incorreto truncado - Mysql

87

Não tenho certeza do que é esse erro!

#1292 - Truncated incorrect DOUBLE value: 

Eu não tenho campo de valor duplo ou dados!

Perdi uma hora inteira tentando descobrir isso!

aqui está minha consulta

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

aqui está o meu programa de criação de tabela para a tabela na qual os resultados estão indo

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
Mike
fonte
7
De acordo com este relatório de bug, a mensagem vem da comparação de uma coluna string com um inteiro, porque ambos são convertidos doublepara a comparação. Como são ac.company_codee ta.company_codedeclarados?
Barmar de
Veja também bugs.mysql.com/bug.php?id=46641 onde um pôster sugeriu que esta mensagem de erro fosse reformulada para "ONDE comparações entre colunas numéricas e não numéricas não são permitidas"
Barmar
Ambas as colunas são int (11) e não strings!
Mike,
Você pode fazer um sqlfiddle com alguns dados de amostra?
Barmar de

Respostas:

159

Esta mensagem significa que você está tentando comparar um número e uma string em uma cláusula WHEREou ON. Em sua consulta, o único lugar potencial onde isso poderia estar ocorrendo é ON ac.company_code = ta.company_code; certifique-se de que eles tenham declarações semelhantes ou use um explícito CASTpara converter o número em uma string.

Se você desligar o strictmodo, o erro deve se transformar em um aviso.

Barmar
fonte
1
Uau, que mensagem de erro enganosa. Obrigado por ajudar. Você estava certo. Eu precisava mudar DB::table('contacts')->where('attendance', $int) ->update(["attendance" => $string]);paraDB::table('contacts')->where('attendance', '' . $int) ->update(["attendance" => $string]);
Ryan
4
Obrigado por isso. Para expandir: existem várias maneiras pelas quais isso pode ser acionado. No meu caso, ele estava usando um regexp para extrair um inteiro de uma string e comparando isso com um inteiro. Estranhamente, quando acabei de usar a instrução SELECT, estava tudo bem: selecione xxxx da junção interna t1 t2 em t1.id = substr (value, locate (':', tagvalue) +1) Uma vez que transformei isso em um INSERT. ..SELECT, o erro foi disparado.
xgretsch de
22

Corrigi este erro porque havia um erro de sintaxe ou alguns caracteres indesejados na consulta, mas o MySQL não foi capaz de detectá-lo. Eu estava usando andentre vários campos durante a atualização, por exemplo

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

O problema na consulta acima pode ser resolvido substituindo andpor vírgula ( ,)

user1926248
fonte
Obrigado, este não é um grande problema, mas às vezes um pequeno problema se torna um grande problema
Sumit Kumar Gupta
Muito obrigado!!!! Isso aconteceu comigo no contexto de uma declaração de atualização
KC Baltz
8

Eu estava enfrentando o mesmo problema. Tentando comparar uma coluna varchar (100) com um numérico 1. Resultou no erro 1292. Corrigido adicionando aspas simples em torno de 1 ('1').

Obrigado pela explicação acima

ForeverLearner
fonte
3

TL; DR

Isso também pode ser causado pela aplicação ORa colunas / literais de string.

Versão completa

Recebi a mesma mensagem de erro para uma INSERTdeclaração simples envolvendo uma visão:

insert into t1 select * from v1

embora todas as colunas de origem e destino fossem do tipo VARCHAR. Após alguma depuração, encontrei a causa raiz; a visão continha este fragmento:

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

que presumivelmente foi o resultado de uma conversão automática do seguinte snippet do Oracle:

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

( ||é a concatenação de string no Oracle). A solução foi usar

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

em vez de.

Frank Schmitt
fonte
Obrigado! Novo no MySQL, eu estava concatenando usando a maneira permitida do SQL Server, algo como string1 + string2 + string3. Sua sugestão da função concat corrigiu esse erro para mim.
Marcy,
1

Quando recebi este erro, acredito que foi um bug, no entanto, você deve ter em mente que se você fizer uma consulta separada com uma instrução SELECT e a mesma cláusula WHERE, então você pode pegar os IDs primários dessa instrução SELECT SELECT CONCAT(primary_id, ','):) e inserir na consulta UPDATE com falha com as condições -> "WHERE [primary_id] IN ([lista de IDs primários separados por vírgulas da instrução SELECT)", que permite aliviar quaisquer problemas causados ​​pela cláusula WHERE da consulta original (com falha).

Para mim, pessoalmente, quando estava usando aspas para os valores em "WHERE ____ IN ([valores aqui])", apenas 10 das 300 entradas esperadas estavam sendo afetadas o que, na minha opinião, parece um bug.

Kylan Hurt
fonte
1

Já vi alguns casos em que esse erro ocorre:

1. usando o operador not equals !=em uma wherecláusula com uma lista de vários orvalores

tal como:

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

Isso pode ser resolvido usando

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

2. falta um operador de comparação em uma if()função:

select if(col1,col1,col2);

para selecionar o valor em col1se ele existir e, caso contrário, mostrar o valor em col2... isso gera o erro; pode ser resolvido usando:

select if(col1!='',col1,col2);
enarmônico
fonte
0

No meu caso, foi uma inserção de visualização (altamente aninhada, visualização em visualização) causando o erro em :

CREATE TABLE tablename AS
  SELECT * FROM highly_nested_viewname
;

A solução que acabamos fazendo foi simular uma visão materializada (que na verdade é uma tabela) e inseri-la / atualizá-la periodicamente usando stored procedures.

Nae
fonte
0

Tive esse problema com ES6 e TypeORM ao tentar passar .where("order.id IN (:orders)", { orders }), onde ordershavia uma sequência de números separados por vírgula. Quando eu converti para um literal de modelo, o problema foi resolvido.

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

Se você usou CHECK CONSTRAINT na tabela para o comprimento do campo de string

por exemplo: para verificar o comprimento do nome de usuário> = 8

usar:

CHECK (CHAR_LENGTH(username)>=8)

ao invés de

CHECK (username>=8)

corrija a restrição de verificação se houver alguma comparação de tipo de dados errada

Trabalho Varadhan
fonte
0

Se você não tiver dados ou campos de valor duplo, talvez deva tentar desabilitar o modo estrito sql.

Para fazer isso você deve editar o arquivo " my.ini " localizado na pasta de instalação do MySQL, encontrar a linha "Definir o modo SQL para estrito" e alterar a linha abaixo:

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

para isso, excluindo "STRICT_TRANS_TABLES"

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

Depois disso, você deve reiniciar o serviço MySQL para habilitar essa alteração.

Para verificar a mudança, abra o editor e execute esta frase sql:

SHOW VARIABLES LIKE 'sql_mode';

Muito importante : tome cuidado com o formato do arquivo após salvá-lo. Salve-o como "UTF8" e não como "TFT8 com BOM" porque o serviço não será reiniciado.

Marc
fonte
É mais seguro fazer isso por sessão, ou ainda melhor apenas no script específico que está modificando as 'tabelas problemáticas': $pdo->query('SET SESSION SQL_MODE = "ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"')e depois da mágica do script, volte estritamente da mesma forma:$pdo->query('SET SESSION SQL_MODE = "STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"')
Piemol