dtnpzghys01643322
dtnpzghys01643322
2016-07-02 13:56

带有Golang SQL驱动程序和UUID的MS SQL uniqueidentifier

  • guid
  • uuid
已采纳

I am connecting to a SQL-Server DB using Go 1.6.2. I am using the go-mssqldb driver (github.com/denisenkom/go-mssqldb) with the sql package.

My problem is that I am creating uuids with the github.com/twinj/uuid package (I also tried some others) and they insert correctly but when I try to scan them out

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

it returns the Id with the first half flipped. I found an explanation in this SO post (https://dba.stackexchange.com/questions/121869/sql-server-uniqueidentifier-guid-internal-representation) and some other articles/posts.

However, I have been unable to find anything specific for solving this in Go. I can't do anything to change the way SQL-server stores the guids. Am I missing something with the UUID scan implementations? I haven't seen a way to change the way it reads. My last option will be to write my own implementation to swap the bits but wanted to reach out to see if I was missing something with the driver or UUID packages or some other library out there.

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

1条回答

  • duanjue6575 duanjue6575 5年前

    Casting (or converting) the Id to a char returns the Id in the expected byte ordering:

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

    Note casting to binary gives the same result as querying the Id directly.

    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))
    
    点赞 评论 复制链接分享