2011-10-25 71 views
3

我想從另一個人管理的DB2數據庫中選擇數據,這樣我就可以將其插入到我管理的SQL數據庫中進行數據操作。我正在使用java程序來執行此操作,並且程序已成功測試了測試數據。但是,由於db2數據中的奇怪符號,我收到了錯誤。這是我的錯誤日誌。DB2 Select Character Issues

Incorrect string value: '\xC2\x97D #5...' for column 'Name' at row 1 
java.sql.SQLException: Incorrect string value: '\xC2\x97D #5...' for column 'Name' at row 1 
INSERT INTO `Temp_Equipment_Inventory`.`PC_Table10i` SET `Account_No`='1019TJ148001',`Inventory_No`='569931',`Building_No`='0060',`Location`='CLASSRM',`FYYR_No`='2004',`Cost`='635.00',`Name`='MICROPHONE LAVALIER WIRELESS (ISCÂD #5290)     SHURE MODEL ULXP14/85          ',`CDCATY`=' ',`CDSRCE`='M',`FLDCAL`=' ',`CDACQN`='G',`FLOWNR`='Y',`FLSHAR`=' ',`CDDELT`='00',`CNYTDT`='00',`NOPURO`='6870607-01 ',`NOPIMO`='01',`CDPREI`='E',`Original_Amount`='155.00',`Serial_Code`='0309040351   ',`CDCOMP`=' ',`NOCHECK`='680146 ',`CDCOMM`='3651400',`Last_Update`='2008-07-18',`CDDEPT`='148',`Room_No`='0300 ',`Date_Scanned`=NULL,`Date_Acquired`='2004-03-09',`Manufacturer_Name`='SHURE  ',`Expiry_Date`=NULL 

正如你所看到的,名稱列有搞笑投擲錯誤的數據(ISCÂD#5290)。但是,當我瀏覽db2表中的數據時,這不會出現。

我已經將mysql表設置爲UTF-8 unicode ci。

我無法編輯db2數據庫,因爲它不是由我管理的。

我還有什麼可以嘗試在我的數據中解決這個符號?

+0

DB2數據庫運行的平臺是什麼?另外,你能找出你從中獲得錯誤的_source_行,找出它實際包含的內容嗎? –

+0

該代碼實際上包含MICROPHONE LAVALIER WIRELESS(ISC — D#5290)SHURE MODEL ULXP14/85,用於將該二進制文件轉換爲文本。 db2運行AS400平臺。所以這個問題發生在&#8212和java.String不理解那個符號。 – Evilsithgirl

+0

'—'是'em-dash'的html編碼(像' - ',但不同)。這表明數據庫中的字符串直接輸出到網頁。我一直無法弄清楚這是如何被誤譯爲''字符(他們似乎沒有共享任何相關的數據點)。 Java實際上認爲該行在插入前是什麼(您得到的錯誤可能是從數據庫中生成的,因此,我們可能有多個翻譯)? –

回答

0

如果你使用UTF-8編碼,你可以嘗試在你的JDBC連接URL中添加下列參數

<connection_url>?useUnicode=yes&characterEncoding=UTF-8 

您可以用您的編碼代替它,如果UTF-8是不適合滿足您的需求。

希望它有幫助。

1

我還能做些什麼來嘗試在數據中繞過此符號?

  1. 什麼是你的測試數據?它是否測試過Â盒?

  2. 製作類似數據庫的虛擬副本,或者在問題所在的位置獲取數據庫的樣本。將該字符替換爲\^A

我仍然認爲問題出在你的java-code中,你沒有解析正確的東西。嘗試使用python或更簡單的代碼與Java做同樣的事情。

0

跳過Java程序並使用DB提供的工具來移動數據。對於DB2,使用db2 export將數據輸出到平面文件中。然後使用mysqlimport將其加載到MySql中。

2

\ XC2 \ X97是用於編碼的Unicode字符—(在破折號)的UTF-8字節序列

好像Java代碼已轉換的UTF-8的數據爲UTF-16(天然的java編碼)而不解碼。然後插入失敗,因爲UTF-16代碼指向字符Â和em破折號實際上是無效的UTF-8代碼點。

或許解決的辦法是在插入之前用UTF-8編解碼器解碼DB2中讀取的內容以獲得正確的UTF-16表示,或者如果目標數據庫需要UTF-8編碼,那麼可能是最好的解決方案不是要通過java.String來完成,而只需讀取和寫入二進制數據。