Espero que alguém possa me ajudar a esclarecer algumas dúvidas sobre esta questão.
Eu tenho uma tabela com este esquema:
CREATE TABLE IF NOT EXISTS `entities` (
`id` int(6) unsigned NOT NULL,
`external_vendor_id` varchar(200) NOT NULL,
PRIMARY KEY (`id`)
) DEFAULT CHARSET=utf8;
Então insiro um registro nesta tabela:
INSERT INTO `entities`
(`id`, `external_vendor_id`)
VALUES
('1', '64835_122334');
Quando seleciono um registro com a instrução a seguir, esse registro é selecionado, mesmo que o external_vendor_id
in da WHERE
cláusula não corresponda ao external_vendor_id
que foi inserido por meio da INSERT
instrução.
select id, external_vendor_id
from `entities`
where `external_vendor_id` = 64835;
Isso está acontecendo no MySQL 5.7.12.
Questões
- Alguém sabe se esse é um resultado esperado? (se sim, por que?)
- Ou isso é um bug nesta versão do MySQL?
Qualquer ajuda será muito apreciada. E uma modificação da consulta para evitar esse resultado será muito útil para entender o que está acontecendo.
Resposta curta: você está misturando e combinando tipos de dados aqui.
Dados em um campo char, sendo consultados com um valor numérico [literal].
Isso força o MySQL a tentar [erroneamente] converter seu valor char em um número.
Ao fazer isso, ele para no primeiro caractere não numérico.
Sempre compare tipos de dados "semelhantes com semelhantes":
(Isso retornará zero linhas, é claro).
Além disso, leia sobre conversões de tipo no manual:
Há alguma forma de conversão implícita acontecendo em segundo plano, que converte seu valor de entrada
64835
em umchar
valor que resulta na seleção do registro.Isso pode ser um bug, mas também pode ser um recurso. Pessoas com mais conhecimento interno sobre o funcionamento do MySQL poderão fornecer uma explicação melhor.
O que você pode fazer é adicionar aspas simples à sua declaração para garantir que você está transmitindo um
varchar
e não umint
que está sendo convertido:Você também pode definir
cast
o valor para achar(5)
:DB Fiddle completo com exemplos
Anexado abaixo o db<>fiddle completo mostrando o que acontece nas diversas situações (incluindo suas descobertas iniciais).
violino
Relatório de bugs
Se você acha que isso pode ser um bug, vá para MySQL | Reporte um bug e insira as informações que você já resumiu em sua pergunta.