2015-09-22 93 views
0

我正在嘗試在我的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都可以讀取它們?

+0

你的問題在於你在MySQL中的列太短。看起來你不會在H2中進行,而是在運行測試時使用MySQL。 – pmartin8

+0

所以也許我不正確地生成十六進制的UUID?我嘗試使用這裏的解決方案:[GUID to ByteArray](https://stackoverflow.com/questions/2983065/guid-to-bytearray)與'org中的Hex.encodeHexString()'結合使用。 apache.commons.codec.binary.Hex' – voor

+0

無論你如何生成HEX,你的目標都不是正確的數據庫,所以我會在其他任何東西之前查看這個問題... – pmartin8

回答

0

您可以根據liquibase腳本中的數據庫設置不同的值。

<property name="myValue" value="[[email protected]" dbms="MySQL" /> 
<property name="myValue" value="9a122c7c991a41c7bfcbf02586f97293" dbms="H2" /> 

然後,您可以在腳本的任何位置使用${myvalue}這個值。

+0

這些值出現在CSV文件中,其中有數百個,但這可能適用於1或2個實例,我真的正在尋找更自動化的解決方案。 – voor

+0

我知道這是一種解決方法,但是如何獲得2個CSV文件,並根據DBMS加載正確的文件? – pmartin8

相關問題