UUID madness with mssql

≯℡__Kan透↙ 提交于 2020-01-01 09:09:55

问题


My database entry has a UUID with the value (extracted using the Microsoft SQL Server Management Studio)

CDF86F27-AFF4-2E47-BABB-2F46B079E98B

After this is loaded into my Scala application, the toString method yields this value

276ff8cd-f4af-472e-babb-2f46b079e98b

How does this happen? And how can I programmatically create a UUID instance, when I have only the bare string CDF86F27-AFF4-2E47-BABB-2F46B079E98B at hand?

Relevant Slick code (former: table definition, latter: database access object)

class ChannelTable(tag: Tag) extends Table[ChannelTuple](tag, "Channel") {
  def id = column[UUID]("Id", O.PrimaryKey)
  def channelId = column[Int]("Channel_Id", O.NotNull)
  def timer = column[UUID]("Timer_Id", O.NotNull)
  def from = column[Timestamp]("FromTime", O.NotNull)
  def to = column[Timestamp]("ToTime", O.NotNull)
  def mon = column[Boolean]("Mon", O.NotNull)
  def tues = column[Boolean]("Tues", O.NotNull)
  def wed = column[Boolean]("Wed", O.NotNull)
  def thu = column[Boolean]("Thu", O.NotNull)
  def fri = column[Boolean]("Fri", O.NotNull)
  def sat = column[Boolean]("Sat", O.NotNull)
  def sun = column[Boolean]("Sun", O.NotNull)
  def * = (id, channelId, timer, from, to, mon, tues, wed, thu, fri, sat, sun)
}

object ChannelDAO extends EntityDAO[Channel, ChannelTuple] {
  private val entities = TableQuery[ChannelTable]
  [...]
  override def get(id: UUID)(implicit session: Session): Option[Channel] = {
    val y = for {
      a <- entities if a.id === id
    } yield (a)
    if (y.list.length > 1) throw new NonUniqueResultException
    y.firstOption
  }
  [...]
}

回答1:


Slick converts a UUID to a uniqueidentifier differently then SQL Server.

endianness is unspecified in .NET / SQL Server.

Make sure to use big endian encoding for UUIDs to be consistent with the JVM if you are getting the UUID from MSSQL.

Check out this SO post. Looks like you will need to create a method to translate the UUID.

How to read a .NET Guid into a Java UUID




回答2:


Works fine for me:

> val uuidString = "CDF86F27-AFF4-2E47-BABB-2F46B079E98B"
uuidString: String = CDF86F27-AFF4-2E47-BABB-2F46B079E98B

> java.util.UUID.fromString(uuidString)
res2: java.util.UUID = cdf86f27-aff4-2e47-babb-2f46b079e98b


来源:https://stackoverflow.com/questions/22402929/uuid-madness-with-mssql

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!