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
double
para a comparação. Como sãoac.company_code
eta.company_code
declarados?Respostas:
Esta mensagem significa que você está tentando comparar um número e uma string em uma cláusula
WHERE
ouON
. 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ícitoCAST
para converter o número em uma string.Se você desligar o
strict
modo, o erro deve se transformar em um aviso.fonte
DB::table('contacts')->where('attendance', $int) ->update(["attendance" => $string]);
paraDB::table('contacts')->where('attendance', '' . $int) ->update(["attendance" => $string]);
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
and
entre vários campos durante a atualização, por exemploupdate user set token='lamblala', accessverion='dummy' and key='somekey' where user = 'myself'
O problema na consulta acima pode ser resolvido substituindo
and
por vírgula (,
)fonte
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
fonte
TL; DR
Isso também pode ser causado pela aplicação
OR
a colunas / literais de string.Versão completa
Recebi a mesma mensagem de erro para uma
INSERT
declaraçã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:que presumivelmente foi o resultado de uma conversão automática do seguinte snippet do Oracle:
(
||
é a concatenação de string no Oracle). A solução foi usarem vez de.
fonte
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.
fonte
Já vi alguns casos em que esse erro ocorre:
1. usando o operador not equals
!=
em umawhere
cláusula com uma lista de váriosor
valorestal como:
Isso pode ser resolvido usando
2. falta um operador de comparação em uma
if()
função:select if(col1,col1,col2);
para selecionar o valor em
col1
se ele existir e, caso contrário, mostrar o valor emcol2
... isso gera o erro; pode ser resolvido usando:select if(col1!='',col1,col2);
fonte
No meu caso, foi uma inserção de visualização (altamente aninhada, visualização em visualização) causando o erro em mysql-5.6:
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.
fonte
Tive esse problema com ES6 e TypeORM ao tentar passar
.where("order.id IN (:orders)", { orders })
, ondeorders
havia uma sequência de números separados por vírgula. Quando eu converti para um literal de modelo, o problema foi resolvido.fonte
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
fonte
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.
fonte
$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"')