我在MySQL选择不受欢迎的记录时遇到了一个非常奇怪的问题。这是我的设置应该重现问题。
表格
CREATE TABLE `users` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`uuid` varchar(36) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
记录
INSERT INTO `users` (`id`, `uuid`)
VALUES
(4, '23ee7c80-ce43-11e2-84b8-da3b984baf8c'),
(12, '4bde3afe-ce30-11e2-9e98-b27639b9f5a0');
查询
SELECT * FROM `users` WHERE `users`.`id` = '4bde3afe-ce30-11e2-9e98-b27639b9f5a' LIMIT 1;
结果
+----+--------------------------------------+
| id | uuid |
+----+--------------------------------------+
| 4 | 23ee7c80-ce43-11e2-84b8-da3b984baf8c |
+----+--------------------------------------+
1 row in set, 1 warning (0.00 sec)
如您所见,它正在选择错误的记录。任何见解都将非常感激。
修改
感谢您的投入。事实证明这是类型转换对我的伎俩!这是MySQL给出的警告:
mysql> SHOW WARNINGS;
+---------+------+-------------------------------------------------------------------------+
| Level | Code | Message |
+---------+------+-------------------------------------------------------------------------+
| Warning | 1292 | Truncated incorrect DOUBLE value: '4bde3afe-ce30-11e2-9e98-b27639b9f5a' |
+---------+------+-------------------------------------------------------------------------+
1 row in set (0.01 sec)
希望我早点检查一下,但是我的客户端程序(Sequel Pro)没有注册警告,只有错误..哦,好吧
答案 0 :(得分:2)
我想,这是类型转换的问题,当你将char与数字进行比较时,它只需要字符串中的4。例如,此查询返回正确的结果:
SELECT * FROM users WHERE cast(users.id as char) = '4bde3afe-ce30-11e2-9e98-b27639b9f5a0'
答案 1 :(得分:0)
看起来应该按UUID
进行过滤。尝试...
SELECT *
FROM `users`
WHERE `users`.`uuid` = '4bde3afe-ce30-11e2-9e98-b27639b9f5a0'