MySQL将uuid与主键匹配
我在MySQL选择不需要的记录时遇到了一个非常奇怪的问题。这是我的设置,应该重现这个问题 表格MySQL将uuid与主键匹配,mysql,sql,primary-key,uuid,Mysql,Sql,Primary Key,Uuid,我在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
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)没有注册警告,只有错误。。哦看起来你应该用
UUID
来过滤。试试看
SELECT *
FROM `users`
WHERE `users`.`uuid` = '4bde3afe-ce30-11e2-9e98-b27639b9f5a0'
我猜,这是类型转换的问题,当您比较char和number时,从字符串中只取4。例如,此查询返回正确的结果:
SELECT * FROM users WHERE cast(users.id as char) = '4bde3afe-ce30-11e2-9e98-b27639b9f5a0'
看起来您是在
id
列而不是uuid
列上进行筛选。。。根据你的数据,你根本不应该得到结果。当你取消限制时会发生什么?您不也在选择id=uuid的位置吗?还有ChrisCamp说的:)结果抛出的警告文本是什么?我知道我在错误的列上过滤。我在构建一个查询时遇到了这个问题,该查询采用混合值并检查id、uuid和用户名是否匹配。这个想法是通过多种方式找到记录。我通过在PHP中运行一些条件而不是在多列上过滤来解决我的特殊问题。@ChrisCamp请参阅我的编辑以获取警告。是的,只是类型转换,请阅读以下内容:)这是我的假设。我必须更加小心地过滤多个列。我本以为MySQL在类型转换方面会更严格,以保持快速的查询速度。。