如何使用 slick 和 mariadb 将 Array[Byte] 插入到二进制数据类型列中?

How to insert Array[Byte] into binary datatype column with slick and mariadb?

我尝试使用 scala 和 play 框架将 Array[Byte] 插入到二进制数据类型列中,并在 MariaDB 上使用。 但是,我收到此错误并且未插入数据。

Execution exception
[MysqlDataTruncation: Data truncation: Incorrect string value: '\x85\x09\x9B\x08%B...' for column 'userID' at row 1]

数据为使用java.util.UUID的UUID。 UUID到Array[Byte]的转换是通过UUIDHelper.scala实现的,即this code.

如何将 Array[Byte] 数据插入数据库?

我的环境是这样的

数据库:

MariaDB 10.1.16

MariaDB [test]> show full columns from user;
+-----------+--------------+-----------------+------+-----+---------+-------+---------------------------------+---------+
| Field     | Type         | Collation       | Null | Key | Default | Extra | Privileges                      | Comment |
+-----------+--------------+-----------------+------+-----+---------+-------+---------------------------------+---------+
| userID    | binary(16)   | NULL            | NO   | PRI | NULL    |       | select,insert,update,references |         |
| firstName | varchar(254) | utf8_general_ci | YES  |     | NULL    |       | select,insert,update,references |         |
| lastName  | varchar(254) | utf8_general_ci | YES  |     | NULL    |       | select,insert,update,references |         |
| fullName  | varchar(254) | utf8_general_ci | YES  |     | NULL    |       | select,insert,update,references |         |
| email     | varchar(254) | utf8_general_ci | YES  |     | NULL    |       | select,insert,update,references |         |
| avatarURL | varchar(254) | utf8_general_ci | YES  |     | NULL    |       | select,insert,update,references |         |
+-----------+--------------+-----------------+------+-----+---------+-------+---------------------------------+---------+

userID 是 UUID 的列。

流畅配置:

slick.dbs.default.driver="slick.driver.MySQLDriver$"
slick.dbs.default.db.driver="com.mysql.jdbc.Driver"

play 和 scala 版本:

scalaVersion := "2.11.7"
libraryDependencies ++= Seq(
  "com.mohiva" %% "play-silhouette" % "3.0.2",
  "org.webjars" %% "webjars-play" % "2.4.0-1",
  "net.codingwell" %% "scala-guice" % "4.0.0",
  "net.ceedubs" %% "ficus" % "1.1.2",
  "com.adrianhurt" %% "play-bootstrap3" % "0.4.4-P24",
  "com.mohiva" %% "play-silhouette-testkit" % "3.0.2" % "test",
  specs2 % Test,
  "com.typesafe.play" %% "play-slick" % "1.0.1",
  "com.typesafe.play" %% "play-slick-evolutions" % "1.0.1",
  //"com.h2database" % "h2" % "1.4.188",
  "mysql" % "mysql-connector-java" % "5.1.39",
  cache,
  evolutions,
  filters
)

字节数组是否用于 UUID?如果是这样,我建议你生成 UUID 的十六进制,然后

INSERT ... (uuid, ...)
    VALUES
    (UNHEX(?), ...)

(我不知道 Slick 中替换的正确语法。)

作为旁注,UUIDs are terrible for scaling

更多

也就是说,不要 尝试将您调用的 "characters" 存储到 binary(16) 中。只有 "bytes"("BLOB",而不是 "CLOB")的东西应该存储在 BINARY.

我解决了问题。

最终,我完全看另外table。在另一个 table 中,也有 userID,userID 的数据类型是 VARCHAR(254)。我将此数据类型固定为 BINARY(16),并在 scala + slick 上使用 Array[Byte] 将数据插入到数据库中。此外,数据可以直接插入到 MariaDB 中,类型为 java.util.UUID.

对不起,打扰了。