Esse bug minha mente eu tenho essa tabela
CREATE TABLE `t_slot` (
`id` int unsigned NOT NULL,
`uid` int unsigned NOT NULL,
`code` char(9) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
`pType` tinyint unsigned NOT NULL,
`pos` tinyint unsigned DEFAULT NULL,
`pid` int unsigned DEFAULT NULL,
`lChild` int unsigned DEFAULT NULL,
`rChild` int unsigned DEFAULT NULL,
`encodeTime` datetime NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `code` (`code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
Então eu tentei fazer uma consulta algo assim
SELECT * FROM t_slot WHERE code = 5;
E com uma grande surpresa, corresponde a 1 linha com valor de
mysql> select * from t_slot where code = 5;
+----+-----+-----------+-------+------+------+--------+--------+---------------------+
| id | uid | code | pType | pos | pid | lChild | rChild | encodeTime |
+----+-----+-----------+-------+------+------+--------+--------+---------------------+
| 2 | 4 | 5FPSLB-BP | 40 | 0 | 1 | 3 | 5 | 2022-03-19 17:39:03 |
+----+-----+-----------+-------+------+------+--------+--------+---------------------+
1 row in set, 50 warnings (0.00 sec)
E recebi esses avisos
mysql> show warnings;
+---------+------+-----------------------------------------------+
| Level | Code | Message |
+---------+------+-----------------------------------------------+
| Warning | 1292 | Truncated incorrect DOUBLE value: 'Y8VHM9-BP' |
| Warning | 1292 | Truncated incorrect DOUBLE value: '5FPSLB-BP' |
| Warning | 1292 | Truncated incorrect DOUBLE value: 'HBV29S-BP' |
... etc
Eu realmente não esperava que 5 combinasse com 5FPSLB-BP
.
Como é que 5 é igual a 5FPSLB-BP
.
"Valor DOUBLE incorreto truncado" -- Mostre-nos o comando que causou isso. Parece
LOAD DATA
sem oOPTIONALLY QUOTED
ou algo assim.WHERE code = 5
-- Ao comparar umaCHAR
coluna -type com um literal numérico (5
), a string é convertida em numérica. Sim, isso é surpreendente, mas é o que acontece no MySQL.Como
code
é "5FPSLB-BP", você provavelmente deve citar a string com a qual está comparando:WHERE code = "5"
. Nesse caso, o teste falhará corretamente.