sql-server - 带有 Golang SQL 驱动程序和 UUID 的 MS SQL 唯一标识符

标签 sql-server go guid uuid

我正在使用 Go 1.6.2 连接到 SQL-Server 数据库。我将 go-mssqldb 驱动程序 (github.com/denisenkom/go-mssqldb) 与 sql 包一起使用。

我的问题是我正在使用 github.com/twinj/uuid 包创建 uuid(我也尝试了其他一些)并且它们正确插入但是当我尝试扫描它们时

err := Database.QueryRow("SELECT Id FROM ...").Scan(&struct.Id)

它返回前半部分翻转的 Id。我在这篇 SO 帖子 ( https://dba.stackexchange.com/questions/121869/sql-server-uniqueidentifier-guid-internal-representation) 和其他一些文章/帖子中找到了解释。

但是,我一直无法找到在 Go 中解决此问题的具体方法。我无法改变 SQL 服务器存储 guid 的方式。我是否遗漏了 UUID 扫描实现的某些内容?我还没有看到改变它阅读方式的方法。我的最后一个选择是编写我自己的实现来交换这些位,但想联系我看看我是否遗漏了驱动程序或 UUID 包或其他一些库。

最佳答案

将 Id 转换(或转换)为 char 以预期的字节顺序返回 Id:

"SELECT cast(Id as char(36)) FROM ..."

请注意转换为二进制给出的结果与直接查询 Id 的结果相同。

0F F1 4D 44 F4 72 49 59 9F C8 18 C2 DB 26 3C 3C  As inserted

44 4D F1 0F 72 F4 59 49 9F C8 18 C2 DB 26 3C 3C  Id (no cast)
44 4D F1 0F 72 F4 59 49 9F C8 18 C2 DB 26 3C 3C  cast(Id as binary(16))
0F F1 4D 44 F4 72 49 59 9F C8 18 C2 DB 26 3C 3C  cast(Id as char(36))

关于sql-server - 带有 Golang SQL 驱动程序和 UUID 的 MS SQL 唯一标识符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38160945/

相关文章:

SQL Server 查询 - 插入问题

sql - 当比较值由两个单独的字段组合时,是否可以使用单个 SQL 获取表中的最小(最大)行?

go - 如何测试在 goroutine 中调用了一个函数?

go - 为什么 goroutines 用缓冲 channel 解决死锁问题?

sql-server - GUID:varchar(36) 与 uniqueidentifier

sql - 如何在同一个表中组合多个查询

sql-server - 使用delphi枚举本地网络上的Microsoft SQL数据库服务器

go - 将 Golang 日志输出设置为文件不会在函数声明之外持续存在

wix - 如何使用wixharvesting工具生成一致的GUID

.net - 在使用 .NET Compact Framework 3.5 的 Windows CE 设备上生成的 GUID 在统计上仍然是唯一的吗?