mysql - 为什么 MySQL/MariaDB 认为字符串 (uuid) 等于整数?
问题描述
我有下表(mariadb:10.3):
CREATE TABLE `people` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`public_id` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL,
`uuid` varchar(36) COLLATE utf8mb4_unicode_ci NOT NULL,
`name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
`slug` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
`old_slug` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`created_at` timestamp NULL DEFAULT NULL,
`updated_at` timestamp NULL DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `people_uuid_unique` (`uuid`),
UNIQUE KEY `people_slug_unique` (`slug`),
UNIQUE KEY `people_public_id_unique` (`public_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
当我对该表运行以下查询时,我得到以下结果。由于某种原因,字符串中的第一个数字与 ID 匹配,ID 是一个自动递增的整数。
询问:
select * from `people` where `id` = "1f028a28-f032-482b-a8b4-dc5483489552"
结果:
+----+-------------+--------------------------------------+-------------+-------------------------+---------------------+---------------------+
| id | public_id | uuid | name | slug | created_at | updated_at |
+----+-------------+--------------------------------------+-------------+-------------------------+---------------------+---------------------+
| 1 | 8ipui1pn9ln | 52ea30f4-cafa-4ddb-8b74-1502a34c3c21 | Mark Hamill | 8ipui1pn9ln-mark-hamill | 2020-04-15 18:47:33 | 2020-04-15 18:47:35 |
+----+-------------+--------------------------------------+-------------+-------------------------+---------------------+---------------------+
请注意,这是精简的示例。我正在针对整数搜索字符串的真正原因是因为我正在针对具有 and 的多个列搜索动态值OR
。
解决方案
MySQL 将通过获取第一个数字序列并忽略从第一个字母开始的任何内容来隐式尝试将字符串转换为 int。
这不是一种直观的行为,但是一旦您意识到它,您可以通过将此类条件显式转换为字符串来避免它。
推荐阅读
- python - Python 记录器 - 将 STDOUT 重定向到日志文件以及任何调试消息
- flutter - Flutter 中的 PageView.Builder 在 null 上调用了 getter 'length'。接收方:null 尝试调用:长度
- firebase-realtime-database - Firebase 实时规则:使用基于角色(令牌)的身份验证将用户分成多个组
- c++ - C ++如何从构造函数中的数组参数初始化/复制const数组成员
- python - 查找下一个非 NaN 值的时间戳
- sql - 在oracle中将数据列成行
- sql-server - 如何在 SQL 中将字符串拆分为列表进行过滤?
- javascript - 如何在 Mongoose 中创建多个对象数组?
- r - 在 R 中预测多变量线性模型
- android - Recyclerview 按字母顺序排列的标题