【问题标题】:error when parsing with sql xmltable with utf-8 encoding in the XML header使用 XML 标头中带有 utf-8 编码的 sql xmltable 解析时出错
【发布时间】:2018-06-19 21:00:29
【问题描述】:

我正在尝试使用 db2 xmltable 函数在 xml 标头中使用 utf-8 解析和 xml 字符串。如果我删除 utf-8 一切运行良好,但如果我把它留在我得到 SQLSTATE 2200M 错误。我错过了什么?我应该注意到我在 IBM i v7.2 和 7.3 上运行它

select * from xmltable(XMLNamespaces( DEFAULT 'IBA/FIXML-5-0-SP2'),                                                
'$d/FIXML/MktDataInc/Inc/SprdBnchmkCurve'                            
passing xmlparse(document                                            
 '<?xml version="1.0" encoding="utf-8" ?>  
 <FIXML xmlns="IBA/FIXML-5-0-SP2" v="FIX.5.0SP2" xv="167" cv="IBA"   
 s="2013-10-14">                                                     
 <MktDataInc TrdDt="2018-06-19">                                     
 <Inc UpdtAct="0" Typ="3" Tm="10:55:05">                             
   <SprdBnchmkCurve Ccy="USD" Name="LIBOR" Point="12M" Px="2.7625"   
 PxTyp="24" />                                                       
   </Inc>                                                            
 <Inc UpdtAct="0" Typ="3" Tm="10:55:05">                             
   <SprdBnchmkCurve Ccy="USD" Name="LIBOR" Point="1M" Px="2.08788"   
 PxTyp="24" />                                                       
   </Inc> </MktDataInc>                                              
            </FIXML> ' ) as "d"
columns POINT char(2) path '@Point', 
cur_val char(10) path '@Px'          
) x                                  

【问题讨论】:

  • 您发布的代码对我来说运行良好(在 Db2 11.1.3.3 上),无论是来自 CLP 还是来自 Data Studio。我不确定你的问题是什么。我确实得到了SQL0445W Value "12M" has been truncated.,因为您的char(2) 太短,但没有SQLSTATE 2200M: A value failed to parse as a well-formed XML document or validate according to the XML schema. 错误

标签: xml db2 db2-400 xmltable


【解决方案1】:

我认为encoding="utf-8" 不起作用的原因是IBM i 中的字符串常量不是utf-8,它是EBCDIC。如果您从 IFS 解析文件,则可能是 utf-8 格式。

【讨论】:

  • 这就是问题所在。我能够使用 get_xml_file 直接从 IFS 文件中读取
【解决方案2】:

您确实应该查看与 SQLCode 相关的错误消息。当我使用 Run SQL Scripts 运行该语句时,我得到以下错误,这清楚地表明错误类型为 7,表示内部编码与外部编码不匹配。

正如 jmarkmurphy 所说,数据是 EBCDIC,但您说的是 UTF-8。如果您真的想要 UTF-8,您可以将数据转换为 UTF-8 以使其正常工作。

select * from xmltable(XMLNamespaces( DEFAULT 'IBA/FIXML-5-0-SP2'),                                                
'$d/FIXML/MktDataInc/Inc/SprdBnchmkCurve'                            
passing xmlparse(document                                            
 CAST('<?xml version="1.0" encoding="utf-8" ?>  
 <FIXML xmlns="IBA/FIXML-5-0-SP2" v="FIX.5.0SP2" xv="167" cv="IBA"   
 s="2013-10-14">                                                     
 <MktDataInc TrdDt="2018-06-19">                                     
 <Inc UpdtAct="0" Typ="3" Tm="10:55:05">                             
   <SprdBnchmkCurve Ccy="USD" Name="LIBOR" Point="12M" Px="2.7625"   
 PxTyp="24" />                                                       
   </Inc>                                                            
 <Inc UpdtAct="0" Typ="3" Tm="10:55:05">                             
   <SprdBnchmkCurve Ccy="USD" Name="LIBOR" Point="1M" Px="2.08788"   
 PxTyp="24" />                                                       
   </Inc> </MktDataInc>                                              
            </FIXML> ' AS CLOB(1M) CCSID 1208)) as "d"
columns POINT char(2) path '@Point', 
cur_val char(10) path '@Px'          
) x   ; 

【讨论】:

    猜你喜欢
    • 2012-11-07
    • 2013-08-04
    • 2013-06-15
    • 1970-01-01
    • 1970-01-01
    • 2018-06-01
    • 1970-01-01
    • 2013-06-10
    • 1970-01-01
    相关资源
    最近更新 更多