MySQL将uuid与主键进行匹配

时间:2013-06-06 19:30:57

标签: 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 `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)没有注册警告,只有错误..哦,好吧

2 个答案:

答案 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'