我有一个MySQL 5.7数据库,其中有几个表在VARCHAR数据类型的列中存储UUID。我正在尝试将我们的代码库转换为使用Slick 3.1.1,但我遇到了UUID转换为字符串的问题。这是我的列定义:
def myCol: Rep[UUID] = column[UUID]("myCol", SqlType("VARCHAR"))
当我运行查询时,会出现以下异常:
Got the exception java.sql.SQLException: Incorrect string value: '\xDA\xFD\xDAuOL...' for column 'myCol' at row 1
据我所知,Slick 假设 UUID 应存储为二进制列类型,因此我尝试使用以下代码将其隐式转换为字符串:
implicit val uuidToString = MappedColumnType.base[UUID, String](_.toString, UUID.fromString)
def myCol: Rep[UUID] = column[UUID]("myCol", SqlType("VARCHAR"))(uuidToString)
这可以用于插入,但是当我使用
myCol
选择值时,结果为空。有人知道如何强制Slick使用VARCHAR而不是BINARY(16)进行数据转换吗?编辑:
使用隐式的查询没有返回任何结果:
db.run { table.filter(_.myCol === val)).result }
但是这个可以:
db.run { table.result }.map(_.filter(_.myCol == val))
编辑2:
我有一个小项目,这里有一个演示: https://github.com/nmatpt/slick-uuid-test
VARCHAR
(因为 UUID 字符串始终为36个字符,去掉连字符后为32个字符)。 - Rogue