【问题标题】:MS SQL uniqueidentifier with Golang SQL driver and UUID带有 Golang SQL 驱动程序和 UUID 的 MS SQL 唯一标识符
【发布时间】:2016-11-04 18:47:07
【问题描述】:

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

我的问题是我正在使用 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 包或其他一些库的内容。

【问题讨论】:

  • 您能否更改您的查询以使用“SELECT convert(Id as varchar(36)) FROM ...”?
  • @mark 我会试一试告诉你!
  • 对不起,更正:convert(char(36), Id)cast(Id as char(36)) data type conversions
  • @mark 如果您将其添加为答案,我会将其标记为已回答。
  • 太棒了!请你试试cast(Id as binary(16))。它可能更有效。它是否也给出了正确的 uuid?

标签: sql-server go guid uuid


【解决方案1】:

将 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))

【讨论】:

    猜你喜欢
    • 2023-04-04
    • 1970-01-01
    • 2012-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-28
    • 1970-01-01
    • 2010-09-16
    相关资源
    最近更新 更多