PostgreSQL
上一页   下一页

第六章. 类型转换

内容
概述
操作符
函数
查询目标
UNION 查询
SQL 查询可能(有意无意地)要求在同一表达式里混合不同的数据类型.Postgres 在计算混合类型表达式方面有许多扩展性很强的功能。

在大多数情况下,用户不需要明白类型转换机制的细节.但是,由 Postgres 所进行的隐含的类型转换会对查询的结果产生明显的影响,这些影响又可以由用户或程序员通过显式的类型转换进行剪裁利用.

本章介绍 Postgres 类型转换的传统和机制。关于特定的类型和函数及操作符的进一步信息,请参考用户手册和程序员手册有关章节.

在程序员手册里有关于隐含类型转换的具体算法的更详细的介绍.

概述

SQL 是强类型语言。也就是说,每一数据都与一个决定其特性和用法的数据类型相联。Postgres有一个可扩展的数据类型系统,该系统比其他RDBMS 对应系统的实现更具通用性和灵活性。因而,Postgres大多数类型转换的特性应该是由通用规则来管理的,而不是由专门搜索方法来分析混合类型表达式的含义,即便是用户定义的类型也应该如此。

Postgres 扫描/分析器只将语法元素分解成五个基本种类:整数(integers),浮点数(floats), 字符串(strings),名字(names)和关键字(keywords).大多数扩展的类型首先表征为字符串(strings).SQL 语言的定义允许将类型名声明为字符串,这个机制被Postgres 用于令分析器沿着正确的方向运行.例如,下面查询

tgl=> SELECT text 'Origin' AS "Label", point '(0,0)' AS "Value";
 Label  | Value
--------+-------
 Origin | (0,0)
(1 row)
有两个字符串(strings)类型 text 和 point.如果类型没有声明,(该类型)先被初始化成一个拥有存储空间的unknown(未知)类型,该类型将在后面描述的晚期阶段分析.

在 Postgres 分析器里,有四种基本的 SQL 元素需要独立的类型转换规则:

操作符
Postgres 允许表达式里使用双目操作符(两个参数),也允许使用左目或右目操作符(单目操作符,一个参数).
函数调用
多数 Postgres 类型系统是建筑在一套丰富的函数上的.任何查询中调用的函数的参数,不管是一个还是多个,必须符合该函数在系统表里的定义.
查询目标
SQL INSERT 语句将查询结果插入表中.查询表达式的类型必须和insert语句的目标列一致或者是(可能需要)转换成一致的.
联合(UNION)查询
因为 UNION SELECT 语句的所有查询结果必须在一列里显示出来,所以每个 SELECT  子句中的元素类型必须相互匹配并转换成一套统一类型.
许多通用的类型转换规则使用建立在 Postgres 函数和操作符系统表基础上的简单转换来实现.在转换规则中包括了一些启发方法,以便更好的支持SQL92 标准中一些传统的内部类型,像 smallintinteger,和float

Postgres 分析器的习惯是:所有类型转换函数接受一个类型是源类型的参数,该参数与目标类型同名.任何符合这一标准的函数都被认为是一个有效的转换函数,因而可以被分析器当作转换函数使用.这个简单的假设令分析器在不需要写硬代码的基础上就可以充分利用类型转换的能力,也让用户定义的类型可以透明地使用同一特性.

分析器中还有一个搜索器用于更好地猜测 SQL 标准类型的确切特性.分析器里有五种定义的类型:布尔(boolean),字符串(string),数字(numeric),几何(geometric)和用户定义(user-defined). 除用户定义类型外,每种类型都有一种"优选类型"用于解决类型定义不明确的问题.每一个"用户定义"的类型就是其自身的"优选类型",所以那些含混不清的表达式(在分析结果中有多种可能的表达式) 如果只有一个用户定义类型则可以正确分析,而那些有多个用户定义类型的表达式会仍然是含糊的,因而会抛出分析错.

含糊的表达式如果其多种候选可能性都是同一种数据类型,则有可能被正确分析,而如果其候选可能性是几种数据类型,则分析很可能会报错,并要求用户将表达式明确化.

要决

所有类型转换规则都是建立在下面几个基本原则上的:
上一页 首页 下一页
IP V4 函数 开头 操作符