【问题标题】:Liquibase binary array for multiple database types用于多种数据库类型的 Liquibase 二进制数组
【发布时间】: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 ByteArrayHex.encodeHexString() 结合使用 org.apache.commons.codec.binary.Hex
  • 无论您如何生成 HEX,您都没有针对正确的数据库,所以我会先查找这个问题...
  • 我的目标是两个数据库。 "[B@..." 格式在 MySQL 中运行良好,但在 H2 中不行。 HEX 格式在 H2 中可以正常工作,但在 MySQL 中不行。
  • H2中的“[B@...”有什么问题?

标签: java mysql maven h2 liquibase


【解决方案1】:

您可以根据 liquibase 脚本中的数据库设置不同的值。

<property name="myValue" value="[B@2ba4b32b" dbms="MySQL" />
<property name="myValue" value="9a122c7c991a41c7bfcbf02586f97293" dbms="H2" />

然后,您可以在脚本中的任何位置使用 ${myvalue} 的值。

【讨论】:

  • 这些值出现在 CSV 文件中,有数百个,虽然这可能适用于 1 或 2 个实例,但我真的在寻找更自动化的解决方案。
  • 我知道这是一种解决方法,但是您有 2 个 CSV 文件,然后根据 DBMS 加载正确的文件怎么样?
猜你喜欢
  • 1970-01-01
  • 2015-11-19
  • 2012-03-18
  • 1970-01-01
  • 2016-02-22
  • 1970-01-01
  • 2022-01-14
  • 2014-11-01
相关资源
最近更新 更多