gpt4 book ai didi

java - 适用于多种数据库类型的 Liquibase 二进制数组

转载 作者:行者123 更新时间:2023-11-29 22:00:22 25 4
gpt4 key购买 nike

我正在尝试在我的 liquibase changeset 中创建一个 loadData 条目,该条目可在 MySQL 数据库和 H2 数据库中使用(用于测试和开发)。我使用了 liquibase-maven-plugin 并成功生成了包含数据库条目的 CSV 文件。我的数据库的所有 BINARY(16) UUID 在我的 CSV 文件中均按以下方式显示: "[B@2ba4b32b" ——我假设这是对 byte[ 的 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 都可以读取它们?

最佳答案

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

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

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

关于java - 适用于多种数据库类型的 Liquibase 二进制数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32721962/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com