【发布时间】:2017-04-16 05:13:42
【问题描述】:
我有一个 MySQL 5.7 数据库,其中包含多个表,这些表将 UUID 存储在具有 VARCHAR 数据类型的列中。我正在尝试将我们的代码库转换为使用 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) 进行数据转换?
编辑:
使用隐式 this 查询不返回任何结果:
db.run { table.filter(_.myCol === val)).result }
但是这个可以:
db.run { table.result }.map(_.filter(_.myCol == val))
EDIT2:
我在这里有一个带有演示的小项目:https://github.com/nmatpt/slick-uuid-test
【问题讨论】:
-
只是一个注释,但您也可以存储高/低位,因为 UUID 只是两个
long值(并将两列配对为单个唯一键)。如果您仍想使用字符串,则不需要VARCHAR(因为 UUID 字符串始终为 36 个字符,32 个字符已删除)。