Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

MS SQL uniqueidentifier with Golang SQL driver and 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.

like image 308
KenWin0x539 Avatar asked Jul 02 '16 13:07

KenWin0x539


1 Answers

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))
like image 130
Mark Avatar answered Oct 03 '22 04:10

Mark