如何使用 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.
对不起,打扰了。
我尝试使用 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.
对不起,打扰了。