source

MySQL/MariaDB에서 문자열(uuid)을 정수와 동일하게 간주하는 이유는 무엇입니까?

nicesource 2023. 7. 23. 14:22
반응형

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와 일치합니다.

쿼리:

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.

MySQL은 첫 번째 숫자 시퀀스를 취하고 첫 번째 문자 이후의 모든 것을 무시함으로써 암묵적으로 int에 문자열을 캐스트하려고 시도합니다.

직관적인 행동은 아니지만, 일단 인지하고 나면 그러한 조건을 명시적으로 문자열에 던짐으로써 피할 수 있습니다.

언급URL : https://stackoverflow.com/questions/61236989/why-does-mysql-mariadb-consider-a-string-uuid-equal-to-integer

반응형