首页 > 解决方案 > 为什么 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

标签: mysqlmariadb

解决方案


MySQL 将通过获取第一个数字序列并忽略从第一个字母开始的任何内容来隐式尝试将字符串转换为 int。

这不是一种直观的行为,但是一旦您意识到它,您可以通过将此类条件显式转换为字符串来避免它。


推荐阅读