为什么MySQL / MariaDB认为字符串(uuid)等于整数?

时间:2020-04-15 19:24:54

标签: mysql mariadb

我有下表(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 |
+----+-------------+--------------------------------------+-------------+-------------------------+---------------------+---------------------+

请注意,这是一个简化的示例。我针对整数搜索字符串的真正原因是因为我针对使用和OR针对多列搜索动态值。

1 个答案:

答案 0 :(得分:1)

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

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