PostgreSQL 10.1 手册_部分 II. SQL 语言_第 8 章 数据类型_8.13. XML类型

本文涉及的产品
云原生数据库 PolarDB MySQL 版,通用型 2核4GB 50GB
云原生数据库 PolarDB PostgreSQL 版,标准版 2核4GB 50GB
简介: 8.13. XML类型 8.13.1. 创建XML值 8.13.2. 编码处理 8.13.3. 访问XML值 xml数据类型可以被用来存储XML数据。它比直接在一个text域中存储XML数据的优势在于,它会检查输入值的结构是不是良好,并且有支持函数用于在其上执行类型安全的操作,参见第 9.14 节。

8.13. XML类型

xml数据类型可以被用来存储XML数据。它比直接在一个text域中存储XML数据的优势在于,它会检查输入值的结构是不是良好,并且有支持函数用于在其上执行类型安全的操作,参见第 9.14 节。使用这种数据类型要求在安装时用configure --with-libxml选项编译。

xml类型可以存储结构良好(如XML标准所定义)的文档,以及内容片段,它们由XML标准中的XMLDecl? content产品所定义。粗略地看,这意味着内容片段中可以有多于一个的顶层元素或字符节点。表达式xmlvalue IS DOCUMENT可以被用来评估一个特定的xml值是一个完整文档或者仅仅是一个文档片段。

8.13.1. 创建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

也可以被使用。

即便输入值指定了一个文档类型声明(DTD),xml类型也不根据DTD来验证输入值。目前也没有内建的支持用于根据其他XML模式语言(如XML模式)来进行验证。

作为一个逆操作,从xml产生一个字符串可以使用函数xmlserialize:

XMLSERIALIZE ( { DOCUMENT | CONTENT } value AS type )

type可以是 charactercharacter varying或 text(或者其中之一的一个别名)。再次地,根据SQL标准,这也是在xml类型和字符类型间做转换的唯一方法,但是PostgreSQL也允许你简单地造型这些值。

当一个字符串不是使用XMLPARSE造型成xml或者不是使用XMLSERIALIZExml造型得到,对于DOCUMENTCONTENT两者的选择是根据XML option 会话配置参数决定的,它可以使用标准命令来设置:

SET XML OPTION { DOCUMENT | CONTENT };

或者是更具有PostgreSQL风格的语法

SET xmloption TO { DOCUMENT | CONTENT };

默认值是CONTENT,因此所有形式的XML数据都被允许。

注意

在使用默认XML option设置时,如果字符串包含一个文档类型声明,你就不能直接将字符串造型成类型xml,因为XML内容片断的定义不接受它们。如果你需要这样做,要么使用XMLPARSE,要么修改XML option。

8.13.2. 编码处理

在客户端、服务器以及其中流过的XML数据上处理多字符编码时必须要注意。在使用文本模式向服务器传递查询以及向客户端传递查询结果(在普通模式)时,PostgreSQL将所有在客户端和服务器之间传递的字符数据转换为目标端的字符编码,参见第 23.3 节。这也包括了表示XML值的串,正如上面的例子所述。这也通常意味着由于字符数据会在客户端和服务器之间传递时被转换成其他编码,包含在XML数据中的编码声明可能是无效的,因为内嵌的编码声明没有被改变。为了处理这种行为,包含在表示xml类型输入的字符串中包含的编码声明会被忽略,并且其内容被假定为当前服务器的编码。接着,为了正确处理,XML数据的字符串必须以当前客户端编码从客户端发出。客户端负责在把文档发送给服务器之前将它们转换为当前客户端编码,或者适当地调整客户端编码。在输出时,xml类型的值将不会有一个编码声明,并且客户端将会假设所有数据都是当前客户端编码。

在使用二进制模式传送查询参数给服务器以及传回查询结果给客户端时,不会执行编码转换,因此情况就有所不同。在这种情况下,XML数据中的编码声明将被注意到,并且如果缺少编码声明时该数据会被假定为UTF-8(由于XML标准的要求,注意PostgreSQL不支持UTF-16)。在输出时,数据将会有一个编码声明来指定客户端编码,除非客户端编码为UTF-8(这种情况下编码声明会被忽略)。

不用说,在PostgreSQL中处理XML数据产生错误的可能性更小,并且在XML数据编码、客户端编码和服务器编码三者相同时效率更高。因为XML数据在内部是以UTF-8处理的,如果服务器编码也是UTF-8时,计算效率将会最高。

小心

当服务器编码不是UTF-8时,某些XML相关的函数可能在非ASCII数据上完全无法工作。尤其在xmltable()xpath()上,这是一个已知的问题。

8.13.3. 访问XML值

xml数据类型有些不同寻常,因为它不提供任何比较操作符。这是因为对于XML数据不存在良定义的和通用的比较算法。这种状况造成的后果就是,你无法通过比较一个xml和一个搜索值来检索行。XML值因此通常应该伴随着一个独立键值域,如一个ID。另一种比较XML值的方案是将它们先转换为字符串,但注意字符串比较对于XML比较方法没有什么帮助。

由于没有可以用于xml数据类型的比较操作符,因此无法直接在这种类型上创建索引。如果需要在XML中快速的搜索,可能的解决方案包括将表达式造型为一个字符串类型然后索引之,或者在一个XPath表达式上索引。当然,实际的查询必须被调整为使用被索引的表达式。

PostgreSQL中的文本搜索功能也可以被用来加速XML数据的全文搜索。但是,所需的预处理支持目前在PostgreSQL发布中还不可用。

本文转自PostgreSQL中文社区,原文链接:8.13. XML类型

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
相关文章
|
2月前
|
关系型数据库 Go 网络安全
go语言中PostgreSQL驱动安装
【11月更文挑战第2天】
102 5
|
5月前
|
SQL 关系型数据库 MySQL
在MySQL中,什么是结构化查询语言 (SQL)
【8月更文挑战第20天】在MySQL中,什么是结构化查询语言 (SQL)
77 1
|
6月前
|
SQL 存储 关系型数据库
SQL语言优缺点有哪些?
SQL(Structured Query Language)语言作为数据库管理和操作的标准语言,具有一系列的优点,同时也存在一些缺点。
124 7
|
3月前
|
SQL Oracle 关系型数据库
SQL语言的主要标准及其应用技巧
SQL(Structured Query Language)是数据库领域的标准语言,广泛应用于各种数据库管理系统(DBMS)中,如MySQL、Oracle、SQL Server等
|
3月前
|
SQL 关系型数据库 MySQL
Go语言项目高效对接SQL数据库:实践技巧与方法
在Go语言项目中,与SQL数据库进行对接是一项基础且重要的任务
100 11
|
4月前
|
XML JSON 关系型数据库
PostgreSQL支持多种数据类型
PostgreSQL支持多种数据类型
188 1
|
5月前
|
SQL 关系型数据库 数据库
|
5月前
|
SQL 关系型数据库 MySQL
|
5月前
|
SQL 存储 大数据
SQL 语言发展史简直太震撼啦!从诞生到现代数据处理,见证一场奇妙的演变之旅,快来感受!
【8月更文挑战第31天】SQL(结构化查询语言)自20世纪70年代由IBM研究员E.F. Codd提出以来,已成为现代数据处理不可或缺的一部分。它最初简化了层次和网状模型中复杂的存储与检索问题,通过基本的SELECT、FROM和WHERE关键字实现了数据查询。80年代,SQL在商业数据库中广泛应用,引入了GROUP BY、HAVING和ORDER BY等功能,增强了数据分析能力。90年代,互联网和企业信息化推动了SQL的进一步优化与扩展,支持分布式数据库和数据仓库等技术。
73 0
|
5月前
|
SQL 存储 NoSQL
从SQL到NoSQL:理解不同数据库类型的选择与应用——深入比较数据模型、扩展性、查询语言、一致性和适用场景,为数据存储提供全面决策指南
【8月更文挑战第31天】在信息技术飞速发展的今天,数据库的选择至关重要。传统的SQL数据库因其稳定的事务性和强大的查询能力被广泛应用,而NoSQL数据库则凭借其灵活性和水平扩展性受到关注。本文对比了两种数据库类型的特点,帮助开发者根据应用场景做出合理选择。SQL数据库遵循关系模型,适合处理结构化数据和复杂查询;NoSQL数据库支持多种数据模型,适用于非结构化或半结构化数据。SQL数据库在一致性方面表现优异,但扩展性较差;NoSQL数据库则设计之初便考虑了水平扩展性。SQL使用成熟的SQL语言,NoSQL的查询语言更为灵活。
109 0