8.13 xml 类型

From PostgreSQL 中文维基, PostgreSQL 中文站, PostgreSQL 中国社区, PostgreSQL Chinese community

Jump to: navigation, search

目录

[编辑] XML 类型

数据类型 xml 可以用于存储 XML 数据。它比用 text 字段存储 XML 数据的优点在于它检查输入的格式,并且还有一些支持函数可以支持在 xml 类型上面进行类型安全的相关操作;参阅9.14. XML 函数。使用这个数据类型要求安装的使用带着配置选项 --with-libxml。

xml 类型可以存储格式正确的“文档”,所谓格式正确就是符合 XML 标准的规定,以及“内容”片断,后者在XML标准的 XMLDecl?content 部分定义。不准确地说, 这意味着内容片断可以有多个顶级的元素或者特性节点。表达式 xmlvalue IS DOCUMENT 可以用于计算一个 xml 数值是完整的文档还是只是一个内容片断。

[编辑] 创建 XML 数值

要从文本数据生成 xml 类型的数值,可以使用函数 xmlparse:

  XMLPARSE ( { DOCUMENT | CONTENT } value)

例子:

  XMLPARSE (DOCUMENT '<?xml version="1.0"?><book><title>Manual</title><chapter>...</chapter></book>')
  XMLPARSE (CONTENT 'abc<foo>bar</foo><bar>foo</bar>')

上面这个方法是SQL标准里唯一定义的把字符串转换成 XML 数值的方法,PostgreSQL 还有两个特有的语法:

  xml '<foo>bar</foo>'
  '<foo>bar</foo>'::xml

也是可以用的。

xml 类型并不针对可能包含的文档类型定义(DTD)校验输入的数值。

逆操作,从 xml 里生成字符串数值,使用函数xmlserialize:

  XMLSERIALIZE ( { DOCUMENT | CONTENT } value AS type )

类型可以是 character,character varying,或者 text(或者这些的别名)。同样,根据 SQL 标准,这是在 xml 和字符类型转换的唯一方法,但是 PostgreSQL 同样允许你简单地在数值间做类型转换。

当字符串数值和 xml 之间相互转换而没有通过 XMLPARSE 或者 XMLSERIALIZE的话,那么认定一个文档是 DOCUMENT 还是 CONTENT 是由会话配置参数“XML 选项”确定的,这些选项可以用下面的标准命令:

  SET XML OPTION { DOCUMENT | CONTENT };

或者更 PostgreSQL 风格的语法

  SET xmloption TO { DOCUMENT | CONTENT };

来设置,缺省的时候是 CONTENT,因此允许所有形式的 XML 数据。

[编辑] 编码处理

在客户端、服务器和通过它们传递的 XML 里面处理多字节编码的时候必须小心。在使用文本模式向服务器传递查询以及给客户端返回结果(常用模式)的时候,PostgreSQL 把所有字符数据都转换成对端的编码;参阅第22.2节。这些动作包含XML数值的字串表现形式,比如像上面那样的例子。这通常意味着在 XML 数据里的编码声明通常都是无效的,因为字符数据会在客户端和服务器之间旅行的时候转换成其他编码,而嵌入的编码声明则没有改变。要想对付这个行为,包含在代表输入的 xml 类型的字串中的编码声明会被忽略掉,而我们将认为内容永远是当前服务器的编码。因此,要想正确处理,这样的 XML 数据的字符串必须从客户端以当前的客户端编码发出。那么,在发送之前,客户端就需要负责把文档转换成当前的客户端编码,或者是合理地调整客户端编码。在输出的时候,类型 xml 的数值将不会有编码声明,而客户端应用必须假设数据是当前客户端的编码。

使用二进制模式在客户端喝服务器之间传递查询参数和获取查询结果的时候,将不会发生字符集的转换,因此情况有所不同。在这种场合下,系统会观察在 XML 数据里面声明的编码,如果没有出现,就会认为是 UTF-8的(XML标准要求;请注意 PostgreSQL 完全不支持 UTF-16)。在输出的时候,数据将会有一个声明客户端编码的编码声明;除非客户端编码是 UTF-8,在这种情况下编码声明会被忽略。

不消说,用 PostgreSQL 处理 XML 数据的时候,如果数据编码,客户端编码喝服务器编码都一样的话,问题将大大减少。因为XML数据在内部都是以UTF-8的形式处理的,所以如果服务器端编码也是 UTF-8,那么计算开销将为更节省。

[编辑] 访问 XML 数值

xml 数据类型比较特殊的地方是,它没有提供任何比较操作符。这是因为现在还没有定义得特别好的并且通用的比较 XML 数据的算法。这样带来的一个问题就是你无法通过在一个搜索值上头比较一个 xml 字段的方法来检索数据行。因此 XML 数值通常都会和一个独立的键字字段,比如一个 ID 伴生在一起。另外一个比较 XML 数值的方法是先把它们转换成字串,不过我们也要知道,字串比较和有用的 XML 比较方法之间没什么关系。

因为xml数据类型上头没有比较操作符,因此我们不太可能在这个类型的字段上直接创建一个索引。如果需要快速搜索 XML 数据,一个绕开的可能方案是把其表达方式转换成一个字符串类型然后索引这个字符串,或者是索引一个 XPath 表达式。实际的查询当然也需要调整成符合索引表达式的方式来使用。

PostgreSQL 里面的文本搜索功能也可以用于加速XML数据里面的全文搜索。不过,在目前这个 PostgreSQL 版本里,还没有必要的预处理支持。

Personal tools