DB2选择字符问题

时间:2011-10-25 15:59:14

标签: java mysql db2

我正在尝试从另一个人管理的DB2数据库中选择数据,因此我可以将其插入到由我管理的SQL数据库中进行数据操作。我正在使用java程序执行此操作,程序已成功测试了测试数据。但是,由于db2数据中的奇怪符号,我收到错误。这是我的错误日志。

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

正如你所看到的,Name列有数据(ISCÂD#5290),有趣的是抛出错误。但是,当我浏览db2表中的数据时,不会出现此情况。

我已将mysql表设置为UTF-8 unicode ci。

我无法编辑db2数据库,因为它不是由我管理的。

我还可以做些什么来尝试绕过我的数据中的这个符号?

4 个答案:

答案 0 :(得分:2)

\ xC2 \ x97是用于编码unicode字符的UTF-8字节序列 - (em破折号)

似乎java代码已将UTF-8数据转换为UTF-16(本机java编码)而不对其进行解码。然后插入失败,因为字符和破折号的UTF-16代码点实际上是无效的UTF-8代码点。

所以也许解决方案是在使用UTF-8编解码器解码DB2中读取的内容以在执行插入之前获取正确的UTF-16表示,或者如果目标数据库需要UTF-8编码,那么可能是最佳解决方案不是要经过java.String,而只是读取和写入二进制数据。

答案 1 :(得分:1)

  

我还可以做些什么来尝试绕过我的数据中的这个符号?

  1. 您的测试数据是什么?它是否针对-cases进行了测试?

  2. 制作类似数据库的虚拟副本,或者在问题所在位置获取数据库样本。将字符替换为\^A

  3. 我仍然认为问题出在你的java -code中,你没有解析正确的事情。尝试用Java编写python或更简单的代码来做同样的事情。

答案 2 :(得分:0)

跳过Java程序并使用DB提供的工具移动数据。对于DB2,使用db2 export将数据导出到平面文件中。然后使用mysqlimport将其加载到MySql中。

答案 3 :(得分:0)

如果您使用UTF-8进行编码,可以尝试在jdbc连接网址中添加以下参数

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

如果UTF-8不适合您的需要,您可以将其替换为您的编码。

希望它有所帮助。