XML 类型适合需要直接存储 XML 原文,并在 SQL 中提取节点文本或属性值的场景。例如,业务系统把 XML 报文、配置片段或元数据原样写入表中,后续再按 XPath 表达式读取局部内容。
使用场景
- 存储来自上游系统的 XML 报文,并在库内校验 XML 格式是否合法。
- 在查询时直接提取 XML 节点文本或属性值,减少应用层重复解析。
使用前提与开启方式
XML 类型由全局系统变量 pkdb_extra_data_type 控制,默认值为 OFF。
在创建 XML 列之前,先确认并开启该变量:
SHOW GLOBAL VARIABLES LIKE 'pkdb_extra_data_type';
SET GLOBAL pkdb_extra_data_type = ON;
开启后,后续新建的 XML 列会在 SHOW CREATE TABLE 和 DESCRIBE 中显示为 xml,并在写入时校验 XML 合法性。
关闭该变量时,XML 关键字本身不会报语法错,但后续新建列会按 longblob 处理,也不会执行 XML 合法性校验。因此,在使用 XML 类型前,建议先通过 SHOW CREATE TABLE 确认列类型。
已经创建好的 xml 列不受该变量后续切换影响。即使之后将 pkdb_extra_data_type 设回 OFF,已有 xml 列仍保持 xml 类型并可继续读写。
SQL 示例
下面的示例展示了如何创建 XML 列、写入 XML 文档,以及使用 EXTRACTVALUE() 提取节点和属性值:
SET GLOBAL pkdb_extra_data_type = ON;
DROP TABLE IF EXISTS books;
CREATE TABLE books (
id INT PRIMARY KEY,
doc XML
);
SHOW CREATE TABLE books;
INSERT INTO books VALUES
(1, '<book id="1"><title>TiDB</title><author>PingCAP</author></book>');
SELECT id, doc FROM books;
SELECT
EXTRACTVALUE(doc, '/book/title') AS title,
EXTRACTVALUE(doc, '/book/@id') AS book_id
FROM books;
DROP TABLE books;
注意事项与限制
- 向
xml列写入非法 XML 文档时,语句会报错,错误信息为Invalid XML value。 - 对
EXTRACTVALUE()来说,如果输入的 XML 文本不合法,函数返回NULL并产生 warning;如果 XPath 表达式不合法,语句会直接报错。 EXTRACTVALUE()可以直接读取xml列,也可以读取普通字符串表达式中的 XML 文本。- 当 XPath 没有匹配到任何节点或属性时,
EXTRACTVALUE()返回空字符串。