【发布时间】:2015-09-22 16:21:40
【问题描述】:
我正在尝试在我的 liquibase changeset 中创建一个 loadData 条目,该条目可用于 MySQL 数据库和 H2 数据库(用于测试和开发)。我使用了liquibase-maven-plugin 并成功生成了包含我的数据库条目的 CSV 文件。我的数据库的所有 BINARY(16) UUID 在我的 CSV 文件中都以以下方式出现:"[B@2ba4b32b"——我假设这是对字节 [] 的 toString() 调用。这适用于 Liquibase 将数据插入回 MySQL。但是,当我尝试在 H2 上运行相同的程序时,出现以下错误:
INSERT INTO PUBLIC.account (systemUuid, ...) VALUES ('[B@2ba4b32b', ...) -- ('[B@2ba4b32b', ...) [90003-187]
! org.h2.jdbc.JdbcSQLException: Hexadecimal string with odd number of characters: "[B@2ba4b32b"; SQL statement:
! INSERT INTO PUBLIC.account (systemUuid, ...) VALUES ('[B@2ba4b32b', ...) -- ('[B@2ba4b32b', ...) [90003-187]
! at org.h2.message.DbException.getJdbcSQLException(DbException.java:345) ~[h2-1.4.187.jar:1.4.187]
! at org.h2.message.DbException.get(DbException.java:179) ~[h2-1.4.187.jar:1.4.187]
! at org.h2.message.DbException.get(DbException.java:155) ~[h2-1.4.187.jar:1.4.187]
! at org.h2.util.StringUtils.convertHexToBytes(StringUtils.java:970) ~[h2-1.4.187.jar:1.4.187]
! at org.h2.value.Value.convertTo(Value.java:864) ~[h2-1.4.187.jar:1.4.187]
! at org.h2.table.Column.convert(Column.java:148) ~[h2-1.4.187.jar:1.4.187]
! at org.h2.command.dml.Insert.insertRows(Insert.java:143) ~[h2-1.4.187.jar:1.4.187]
! at org.h2.command.dml.Insert.update(Insert.java:114) ~[h2-1.4.187.jar:1.4.187]
! at org.h2.command.CommandContainer.update(CommandContainer.java:78) ~[h2-1.4.187.jar:1.4.187]
! at org.h2.command.Command.executeUpdate(Command.java:254) ~[h2-1.4.187.jar:1.4.187]
! at org.h2.jdbc.JdbcStatement.executeInternal(JdbcStatement.java:184) ~[h2-1.4.187.jar:1.4.187]
! at org.h2.jdbc.JdbcStatement.execute(JdbcStatement.java:158) ~[h2-1.4.187.jar:1.4.187]
! at liquibase.executor.jvm.JdbcExecutor$ExecuteStatementCallback.doInStatement(JdbcExecutor.java:294) ~[liquibase-core-3.1.1.jar:na]
! at liquibase.executor.jvm.JdbcExecutor.execute(JdbcExecutor.java:54) ~[liquibase-core-3.1.1.jar:na]
! ... 16 common frames omitted
但是,如果我将二进制数组转换为十六进制字符串,例如"9a122c7c991a41c7bfcbf02586f97293",那么当我尝试将数据导入 MySQL 时会出现以下错误:
! com.mysql.jdbc.MysqlDataTruncation: Data truncation: Data too long for column 'systemUuid' at row 1
! at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4185) ~[mysql-connector-java-5.1.25.jar:na]
! at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4119) ~[mysql-connector-java-5.1.25.jar:na]
! at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2570) ~[mysql-connector-java-5.1.25.jar:na]
! at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2731) ~[mysql-connector-java-5.1.25.jar:na]
! at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2809) ~[mysql-connector-java-5.1.25.jar:na]
! at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2758) ~[mysql-connector-java-5.1.25.jar:na]
! at com.mysql.jdbc.StatementImpl.execute(StatementImpl.java:894) ~[mysql-connector-java-5.1.25.jar:na]
! at com.mysql.jdbc.StatementImpl.execute(StatementImpl.java:732) ~[mysql-connector-java-5.1.25.jar:na]
! at liquibase.executor.jvm.JdbcExecutor$ExecuteStatementCallback.doInStatement(JdbcExecutor.java:294) ~[liquibase-core-3.1.1.jar:na]
! at liquibase.executor.jvm.JdbcExecutor.execute(JdbcExecutor.java:54) ~[liquibase-core-3.1.1.jar:na]
我应该如何将二进制数组存储在 Liquibase 变更集中,以便 MySQL 和 H2 都可以读取它们?
【问题讨论】:
-
您的问题是 MySQL 中的列太短。运行测试时,您似乎不是在 H2 中,而是在 MySQL 中。
-
所以也许我没有正确生成十六进制的 UUID?我正在尝试使用此处的解决方案:GUID to ByteArray 与
Hex.encodeHexString()结合使用org.apache.commons.codec.binary.Hex -
无论您如何生成 HEX,您都没有针对正确的数据库,所以我会先查找这个问题...
-
我的目标是两个数据库。
"[B@..."格式在 MySQL 中运行良好,但在 H2 中不行。 HEX 格式在 H2 中可以正常工作,但在 MySQL 中不行。 -
H2中的“[B@...”有什么问题?
标签: java mysql maven h2 liquibase