我正在尝试从另一个人管理的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数据库,因为它不是由我管理的。
我还可以做些什么来尝试绕过我的数据中的这个符号?
答案 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)
我还可以做些什么来尝试绕过我的数据中的这个符号?
您的测试数据是什么?它是否针对-cases进行了测试?
制作类似数据库的虚拟副本,或者在问题所在位置获取数据库样本。将字符替换为\^A
。
我仍然认为问题出在你的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不适合您的需要,您可以将其替换为您的编码。
希望它有所帮助。