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 TABLEDESCRIBE 中显示为 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() 返回空字符串。

相关文档