gpt4 book ai didi

Oracle 神秘的 Unicode 代码点

转载 作者:行者123 更新时间:2023-12-02 08:50:08 27 4
gpt4 key购买 nike

在应包含有效 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.

现在这个无效字符被指定为 Unicode 代码点 EDAFBF。问题是,根据 Unicode 规范(维基百科),没有超过 10FFFF 的代码点。那么这个错误意味着什么?

使用 SQLDeveloper 检查此 CLOB(并将其复制到 Notepad++,编码设置为 utf-8)并没有发现任何异常,除了一些奇怪的字符,这些字符显然来自用户浏览器,当他从 Microsoft Word 文档复制文本时(但CLOB,至少从 SQLDeveloper UI 复制并由 Notepad++ 使用 UTF-8 编码显示,似乎是有效的 UTF-8 文本)。

是否可以通过直接(从 SQLDeveloper 或其他方式)填充 Oracle 来重现此错误? (联系最终用户以了解他在网络表单中准确输入的内容是有问题的)

最佳答案

没有解决问题的第一部分,但您可以使用 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

只需选择角色:

select utl_raw.cast_to_varchar2(cast('EDAFBF' as raw(6)))
from dual;

... 在我的 SQL Developer(版本 4.1)中显示为一个小方 block ,里面有一个更小的问号(我认为),但这就是它选择呈现它的方式;复制和粘贴仍然给出 the replacement character � 正如您所说,因为代码点无效。 XMLType 对有效性的要求比 CLOB 更严格。 unistr() 函数也不处理该值,这并不奇怪。

(您不需要将字符串转换为 raw(6),只需 utl_raw.cast_to_varchar2('EDAFBF') 具有相同的效果;但是这样做我认为明确地让事情变得更清楚)。

我不明白它是如何进入你的文件而没有某种损坏的,我想可能是通过拙劣的字符集转换。您可以使用 dbms_lob.replace_fragment() 或类似的方法来替换或删除该字符,但当然可能还有其他字符您还没有遇到,最多只能治疗症状而不是原因。

关于Oracle 神秘的 Unicode 代码点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28740418/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com