Oracle神秘的Unicode代码点

Oracle神秘的Unicode代码点,oracle,unicode,utf-8,oracle11g,Oracle,Unicode,Utf 8,Oracle11g,在CLOB列上调用XMLTYPE(),该列应包含有效的XML1.0 xml(db编码应为UTF-8),出现以下错误消息(我来自意大利): 现在,此无效字符被指定为Unicode码点EDAFBF。问题是根据Unicode规范(wikipedia),在10FFFF之外没有代码点。那么这个错误意味着什么呢 使用SQLDeveloper检查此CLOB(并将其复制到Notepad++中,编码设置为utf-8),除了用户从Microsoft Word文档复制文本时出现的一些奇怪字符外,没有发现任何异常(但C

在CLOB列上调用XMLTYPE(),该列应包含有效的XML1.0 xml(db编码应为UTF-8),出现以下错误消息(我来自意大利):

现在,此无效字符被指定为Unicode码点EDAFBF。问题是根据Unicode规范(wikipedia),在10FFFF之外没有代码点。那么这个错误意味着什么呢

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


有没有办法直接(从SQLDeveloper或以其他方式)在Oracle中复制此错误?(联系最终用户以了解他在web表单中的确切内容是有问题的)

没有解决问题的第一部分,但您可以使用原始值复制它:

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
…在SQL Developer for me(版本4.1)中显示为一个小正方形,里面有一个更小的问号(我想),但这正是它选择渲染它的方式;复制和粘贴仍然会给� 正如您所说,由于代码点无效,因此.XMLType对有效性的要求比CLOB更严格。
unistr()
函数也不处理该值,这并不奇怪

(您不需要将字符串强制转换为
raw(6)
,只需
utl\u raw。将字符串强制转换为\u varchar2('EDAFBF')
具有相同的效果;但我认为,显式执行该操作会使事情变得更清楚)


我不明白,如果没有某种损坏,它怎么会进入您的文件,我想可能是通过一个拙劣的字符集转换。您可以使用
dbms\u lob.replace\u fragment()
或类似的方法来替换或删除该角色,但当然可能还有其他角色你还没有击中,而且充其量只能治疗症状而不是原因。

当你查看CLOB时,你看到了吗?这是一个奇怪的角色吗?@AlexPoole好的,但我没有看到“EDAFBF”的标准。此外,我注意到您引用的页面上的页面/子页面信息不正确(它指的是带有5个十六进制字符的代码点)。然后(我在问题中添加了它),我如何重新创建直接填充oracle的错误(因为联系用户了解他输入的内容是有问题的,然后可能是他甚至不记得了)。是的,我意识到页面只是显示替换字符,这没有帮助;但您的客户端/记事本可能也在这样做,而XMLType更为严格。@AlexPoole在我用SQLDeveloper打开页面时回答了您的新评论(打开xml,我看不到带问号的菱形,但只有一个带薄黑边框的空正方形。关于U+EDAFBF的错误消息可能会误导人吗?我看不出它怎么会在CLOB字段中存储这么大的代码点。碰巧字节序列0xED,0xAF,0xBF是代理U+DBFF,wh的UTF-8编码ich的有效性值得怀疑,在XML解析中肯定是不被允许的。如果你十六进制转储CLOB的内容,你会得到什么,可能实际上有一个糟糕的UTF-8序列在那里?谢谢你,这对我来说非常有趣,只要我有足够的分数,我就会投票给这个答案。查询在版本11.2上给出不同的结果.0.1.0和11.2.0.4.0(如我所知,相应的dbs和实例在配置上没有明显的差异)。答案中报告的错误出现在(SQLDeveloper连接到)后者上(问题中引用的原始错误也出现在那里)。我看到的是11.2.0.1.0“LPX-00285:Subrogato Unicode 0xDBFF 0x3C无效”(事实上@bobince在对问题的评论中注意到,'EDAFBF'是Unicode码点0xDBFF的UTF-8编码)@麻烦的制作者-我使用的是11.2.0.3,因此可能在补丁版本中行为发生了变化。我假设DB字符集是相同的,但不确定它是否与UTF有关。但在我的测试中通过DBFF对XMLType有效:
select XMLType(“| | utl| u raw.cast_to_varchar2('DBFF')| |”从dual;
获取
。因此更令人困惑。
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;