【发布时间】:2022-01-19 22:49:39
【问题描述】:
假设我们在 Oracle 中有以下 XMLType:
<?xml version="1.0" encoding="UTF-8"?>
<root>
</root>
我需要获取 XML 版本和编码值或整个 XML 序言,最好使用 XML 函数,f。前任。 XML 表。那可能吗?还是仅使用字符串/CLOB 函数?
我们使用 Oracle 19c。
【问题讨论】:
假设我们在 Oracle 中有以下 XMLType:
<?xml version="1.0" encoding="UTF-8"?>
<root>
</root>
我需要获取 XML 版本和编码值或整个 XML 序言,最好使用 XML 函数,f。前任。 XML 表。那可能吗?还是仅使用字符串/CLOB 函数?
我们使用 Oracle 19c。
【问题讨论】:
这可能吗?
不,不幸的是,它不是,因为 XMLTable 之类的 XML 函数与 XMLType 一起使用,它解析您的输入 xml(如果它是 CLOB 或 Varchar2,则来自您的 NLS_LANG 字符集,如果它是 BLOB,则来自指定的字符集)并将其存储在自己的内部代码页,当你得到它时,oracle 在你的 NLS_LANG 中返回它:
SQL> with v as (select q'[<?xml version="1.1" encoding="blabla"?><root/>]' as vXML from dual)
2 select xmltype(vXML) x from v;
X
------------------------------------------------
<?xml version="1.1" encoding="US-ASCII"?>
<root/>
如果我将 NLS_LANG 更改为 UTF8 会怎样:
SQL> with v as (select q'[<?xml version="1.1" encoding="blabla"?><root/>]' as vXML from dual)
2 select xmltype(vXML) x from v;
X
-----------------------------------------
<?xml version="1.1" encoding="UTF-8"?>
<root/>
SQL> ! env | grep NLS_LANG
NLS_LANG=american_america.UTF8
【讨论】: