Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL将uuid与主键匹配_Mysql_Sql_Primary Key_Uuid - Fatal编程技术网

MySQL将uuid与主键匹配

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

我在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)没有注册警告,只有错误。。哦

看起来你应该用
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在类型转换方面会更严格,以保持快速的查询速度。。