gpt4 book ai didi

mysql - 在 MySQL 中编写与 UUID 列匹配的查询的正确方法是什么?

转载 作者:行者123 更新时间:2023-11-29 00:41:58 27 4
gpt4 key购买 nike

我有一个应用程序要从 Postgres 移植到 MySQL。不要管为什么。该应用程序使用 Entity Framework 4 来查询数据库。

由于种种原因,我不得不在我的C#代码中使用Guids,将它们保存到数据库中,然后根据保存的Guids值查询数据。我不太熟悉 MySQL 以及它如何处理本质上是 blob 的内容。

首先,MySQL中没有UUID类型。我必须将它们保存为 BINARY(16) 值。好的。我已将列创建为 BINARY(16),并将数据写入表中。好。

我的问题是我看不到 Guid 的存储值匹配。我编写了一个单元测试,将具有已知 Guid 的数据写入表,然后尝试检索它。数据很好地进入了数据库,但是当我尝试读回它时,我没有得到任何行。

这是一个示例表架构:

CREATE TABLE `MyDatabase`.`MyTable` (
`id` INT NOT NULL AUTO_INCREMENT,
`guid` BINARY(16) NOT NULL,
`applicationId` INT(11) NOT NULL,
`name` VARCHAR(256) NOT NULL,
Description VARCHAR(256) NULL,
SessionTimeout INT NOT NULL,
DomainId INT NOT NULL,
PRIMARY KEY (`id`),
CONSTRAINT IX_aspnetx_groups UNIQUE ( `applicationId`, `id` )
);

这是 Entity Framework 代码:

var g = ( from r in context.MyTable
where r.guid = id
select r ).Single();

这是 Entity Framework 生成的查询:

SELECT
`Extent1`.`id`,
`Extent1`.`guid`,
`Extent1`.`applicationId`,
`Extent1`.`name`,
`Extent1`.`Description`,
`Extent1`.`SessionTimeout`,
`Extent1`.`DomainId`
FROM `aspnetx_groups` AS `Extent1`
WHERE `Extent1`.`guid` = '81d7de5e-4212-4ff8-b3d4-9f115261971d' LIMIT 2;

执行此操作时,它不返回任何行,导致在我的 C# 代码中抛出“序列不包含任何元素”异常。

我如何使它工作?

最佳答案

在您的 SELECT 的 WHERE 子句中,看起来您正在将 BINARY(16)(等号左侧的 guid)与右侧的字符串文字进行比较。

要执行有效比较,我会将字符串文字转换为 BINARY(16),然后将其与 guid 进行比较。

因此,删除所有破折号字符然后使用 UNHEX 函数应该可以解决问题:

WHERE `Extent1`.`guid` = 
UNHEX(REPLACE('81d7de5e-4212-4ff8-b3d4-9f115261971d','-',''))

为了提高性能,您希望查询引用左侧的裸 guid 列(就像它所做的那样),并且将 guid 列包装在任何类型的函数中。您会希望在谓词的字面量方面进行任何转换,以便只需在查询开始时进行一次转换,而不必对表中的每一行进行一次转换。

关于mysql - 在 MySQL 中编写与 UUID 列匹配的查询的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11891295/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com