【问题标题】:Why does MySQL/MariaDB consider a string (uuid) equal to integer?为什么 MySQL/MariaDB 认为字符串 (uuid) 等于整数?
【发布时间】:2020-04-15 19:24:54
【问题描述】:

我有下表(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 搜索多个列的动态值。

【问题讨论】:

  • 请注意,为了便于理解,精简版可能会使用 '3c21' 这样的 id 而不是 '52ea30f4-cafa-4ddb-8b74-1502a34c3c21'。
  • 当然,“名字”不能是UNIQUE

标签: mysql mariadb


【解决方案1】:

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

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

【讨论】:

  • 这样就搞定了。谢谢你。在做了更多阅读之后,我能够在 where 语句中使用 BINARY 函数来获得我正在寻找的结果。
猜你喜欢
  • 2011-10-14
  • 2020-09-21
  • 2012-12-07
  • 1970-01-01
  • 1970-01-01
  • 2012-02-15
  • 2021-12-13
  • 2020-09-24
  • 1970-01-01
相关资源
最近更新 更多