我正在嘗試在我的liquibase changeset
中創建一個loadData
條目,該條目可用於MySQL數據庫和H2數據庫(用於測試和開發)。我使用了liquibase-maven-plugin
併成功生成了包含我的數據庫條目的CSV文件。我的數據庫中的所有BINARY(16)UUID在我的CSV文件中以下列方式顯示:"[[email protected]"
- 我假設它是對byte []的toString()調用。這可以很好地與Liquibase將數據插入到MySQL中。然而,當我嘗試運行H2相同的我碰到下面的錯誤:用於多種數據庫類型的Liquibase二進制數組
INSERT INTO PUBLIC.account (systemUuid, ...) VALUES ('[[email protected]', ...) -- ('[[email protected]', ...) [90003-187]
! org.h2.jdbc.JdbcSQLException: Hexadecimal string with odd number of characters: "[[email protected]"; SQL statement:
! INSERT INTO PUBLIC.account (systemUuid, ...) VALUES ('[[email protected]', ...) -- ('[[email protected]', ...) [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。 – pmartin8
所以也許我不正確地生成十六進制的UUID?我嘗試使用這裏的解決方案:[GUID to ByteArray](https://stackoverflow.com/questions/2983065/guid-to-bytearray)與'org中的Hex.encodeHexString()'結合使用。 apache.commons.codec.binary.Hex' – voor
無論你如何生成HEX,你的目標都不是正確的數據庫,所以我會在其他任何東西之前查看這個問題... – pmartin8