tro*_*ker 2 oracle unicode utf-8 oracle11g
在应包含有效 XML1.0 xml(数据库编码应为 UTF-8)的 CLOB 列上调用 XMLTYPE() 时,出现以下错误消息(我来自意大利):
ORA-31011: Analisi XML non riuscita
ORA-19202: Errore durante l'elaborazione XML
LPX-00217: carattere non valido 15577023 (U+EDAFBF)
Error at line 240
ORA-06512: a "SYS.XMLTYPE", line 272
ORA-06512: a line 1
31011. 00000 - "XML parsing failed"
*Cause: XML parser returned an error while trying to parse the document.
*Action: Check if the document to be parsed is valid.
Run Code Online (Sandbox Code Playgroud)
现在这个无效字符被指定为Unicode 代码点 EDAFBF。问题是,根据 Unicode 规范(维基百科),没有超过10FFFF 的代码点。那么这个错误意味着什么?
使用 SQLDeveloper 检查此 CLOB(并将其复制到 Notepad++,编码设置为 utf-8)并没有发现任何异常,除了一些奇怪的字符之外,当他从 Microsoft Word 文档复制文本时显然来自用户浏览器(但是 CLOB,在至少从 SQLDeveloper UI 复制并由 Notepad++ 以 UTF-8 编码展示,似乎是有效的 UTF-8 文本)。
有没有办法直接(从 SQLDeveloper 或以其他方式)重现填充 Oracle 的此错误?(联系最终用户以了解他在 Web 表单中输入的内容是有问题的)
不解决问题的第一部分,但您可以使用 RAW 值重现它:
select xmltype('<dummy>'
|| utl_raw.cast_to_varchar2(cast('EDAFBF' as raw(6)))
|| '</dummy>')
from dual;
Error report -
SQL Error: ORA-31011: XML parsing failed
ORA-19202: Error occurred in XML processing
LPX-00217: invalid character 15577023 (U+EDAFBF)
Error at line 1
ORA-06512: at "SYS.XMLTYPE", line 310
ORA-06512: at line 1
Run Code Online (Sandbox Code Playgroud)
只需选择字符:
select utl_raw.cast_to_varchar2(cast('EDAFBF' as raw(6)))
from dual;
Run Code Online (Sandbox Code Playgroud)
...在我的SQL Developer(版本4.1)中显示为一个带有更小的问号的小方块(我认为),但这就是它选择呈现的方式;复制和粘贴仍然给出替换字符?因为代码点,正如你所说,是无效的。XMLType 在有效性方面比 CLOB 更严格。该unistr()函数也不处理该值,这并不奇怪。
(您不需要将字符串强制转换为raw(6),只是utl_raw.cast_to_varchar2('EDAFBF')具有相同的效果;但我认为明确地执行它会使发生的事情更清楚一些)。
我不知道它是如何在没有某种损坏的情况下进入您的文件的,我想可能是通过拙劣的字符集转换。您可能可以使用dbms_lob.replace_fragment()或类似的方法来替换或删除该角色,但当然可能还有其他您尚未击中的角色,充其量您只会治疗症状而不是原因。