Я пытаюсь создать запись loadData
в своей liquibase changeset
, которую можно использовать как в базе данных MySQL, так и в базе данных H2 (для тестирования и разработки). Я использовал liquibase-maven-plugin
и успешно создал CSV-файлы, содержащие записи для моей базы данных. Все BINARY(16) UUID для моей базы данных отображаются в моем CSV-файле следующим образом: "[B@2ba4b32b"
-- который, как я предполагаю, является вызовом toString() для byte[]. Это отлично работает с 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 могли их читать?
Hex.encodeHexString()
вorg.apache.commons.codec.binary.Hex
- person voor   schedule 22.09.2015"[B@..."
отлично работает в MySQL, но не в H2. Формат HEX отлично работает в H2, но не в MySQL. - person voor   schedule 22.09.2015