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.
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))
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With