2012-07-24 104 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