2012-07-24 152 views
1

我使用MAMP从MySQL数据库导出了一些blob十六进制值。我想这些值添加到一个数据库,H2,但我不断收到错误:无法将blob从MySQL传输到H2

org.h2.jdbc.JdbcSQLException: Hexadecimal string with odd number of characters: "80273753912952185238922745508880797601482513992540829416944108482201678079823009423240796439787688076562876906583780517704249256776629049440054030707230103901187860416530898080584543691951511619479802824069658267005899514817053628822676904964354186008390099680162497341280836375590099576180828248580706583256766125057680523862652582731318422096302127828322568212884418137380647350895148022669223845592468192584084729728626393575544"; SQL statement: 
INSERT INTO `StatisticsExplanationActivity` VALUES(2, '2012-06-01 11:36:36', '0', '2012-06-01 11:36:37', 1, 16, 0x00aced0005737200136a6176612e7574696c2e41727261794c6973747881d21d99c7619d03000149000473697a6578700000000577040000000a7400196d757365756d507265666572656e63655f6f7269656e74616c7400166d757365756d507265666572656e63655f70686f746f740014696465616c686f6c79646179735f75726261696e7400176e696768744576656e696e67486f6262795f6d757369637400106d75736963616c54617374655f706f7078) -- (2, '2012-06-01 11:36:36', '0', '2012-06-01 11:36:37', 1, 16, 80273753912952185238922745508880797601482513992540829416944108482201678079823009423240796439787688076562876906583780517704249256776629049440054030707230103901187860416530898080584543691951511619479802824069658267005899514817053628822676904964354186008390099680162497341280836375590099576180828248580706583256766125057680523862652582731318422096302127828322568212884418137380647350895148022669223845592468192584084729728626393575544) [90003-166] 
    at org.h2.message.DbException.getJdbcSQLException(DbException.java:329) 
    at org.h2.message.DbException.get(DbException.java:169) 
    at org.h2.message.DbException.get(DbException.java:146) 
    at org.h2.util.StringUtils.convertHexToBytes(StringUtils.java:990) 

相同的INSERT线工作正常使用MySQL。我在其他一些话题上看到,当启用H2的多线程模式时可能会发生这种情况。我想尝试一下,但我不知道如何使用Play来设置该参数! 1.2.x.

编辑:试了MULTI_THREADED的东西,但仍然得到相同的错误。 EDIT2:忘记而我使用的十六进制数:

0xaced0005737200136a6176612e7574696c2e41727261794c6973747881d21d99c7619d03000149000473697a6578700000000577040000000a7400196d757365756d507265666572656e63655f6f7269656e74616c7400166d757365756d507265666572656e63655f70686f746f740014696465616c686f6c79646179735f75726261696e7400176e696768744576656e696e67486f6262795f6d757369637400106d75736963616c54617374655f706f7078 
+0

您是否尝试过填充斑点与奇数个字符与前一个'0'? – F21 2012-07-24 08:47:51

+0

是的,但没有用,因为在错误消息中它抱怨数字的十进制版本(这不会通过添加0来改变)。 – user1502150 2012-07-24 08:52:18

+1

很可能0x00aced0 ..被解释为一个数字(Java BigDecimal),然后数据库尝试将toString()表示形式转换为二进制形式。这在50%的情况下失败了。所以,而不是0x00aced0 ...使用'00aced0 ...'(引用) – 2012-07-24 13:52:07

回答

2

的H2数据库解释0x00aced0...数字(一个Java的BigDecimal),然后它尝试了toString()表示(十进制数)转换作为十六进制编码二进制。

这当然不是你想要的,它在大约50%的情况下都失败了。

所以不是0x00aced0...你需要使用'00aced0...'(引)

+0

我有一个类似的问题,除非它首先不会坚持“Blob”。我使用标准的'Blob'实现和JPA,所以我实际上不能添加引号。在这种情况下我能做些什么(在放弃H2的情况下)? – 2013-01-07 15:36:17

+0

我想你的问题和这个问题是无关的。我建议开一个新的问题。 – 2013-01-07 15:38:49

+0

已经有一个打开:http://stackoverflow.com/questions/14197779/uploading-a-file-in-java-play-1-2-3-then-storing-file-as-byte-array-causes- persi我发现这个问题的谷歌搜索“十六进制字符串的奇数字符” – 2013-01-07 15:40:10