当前位置:早雪网网络学院编程文档数据库技术Postgresql → PostgreSQL7.0手册-用户手册-6. 类型转换

PostgreSQL7.0手册-用户手册-6. 类型转换

减小字体 增大字体 作者:不详  来源:supcode.com收集整理  发布时间:2005-7-23 12:18:32
第六章. 类型转换
内容 
概述 
操作符 
函数 
查询目标 
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 标准中一些传统的内部类型,像 smallint,integer,和float. 
Postgres 分析器的习惯是:所有类型转换函数接受一个类型是源类型的参数,该参数与目标类型同名.任何符合这一标准的函数都被认为是一个有效的转换函数,因而可以被分析器当作转换函数使用.这个简单的假设令分析器在不需要写硬代码的基础上就可以充分利用类型转换的能力,也让用户定义的类型可以透明地使用同一特性. 

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

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

要决
所有类型转换规则都是建立在下面几个基本原则上的: 
隐含转换决不能有奇怪的或不可预见的输出. 
用户定义类型,因为分析器对其没有预先的认识,在类型级别中应该级别较"高".在混合类型的表达式里,内部类型总是应该转换成用户定义类型.(当然只是在必须转换的时候). 
用户定义类型是不相关的.当前,Postgres 除了用于内部数据类型的硬代码搜索器和以系统表中现有函数为基础的隐含类型关系外,没有任何可用于处理类型间关系的信息。 
如果一个查询不需要隐含的类型转换,分析器或执行器不应该进行更多的额外操作.这就是说,任何一个类型匹配,格式清晰的查询不应该在分析器里耗费更多的时间,也不应该做任何不必要的类型转换. 

另外,如果一个查询通常使用某个函数进行隐含类型转换,而用户显式定义了一个有正确参数的函数,解释器应该使用新函数取代原先旧函数的隐含操作。


--------------------------------------------------------------------------------
--------------------------------------------------------------------------------

操作符
转换过程
操作符计算 
在 pg_operator 系统表里找出准确的匹配. 
  
如果一个双目操作符的一个参数是 unknown.则假设其与另一个参数类型相同. 
掉转参数,寻找一个做为反向操作符匹配时指向自身操作符.如果找到,则掉转分析树上的参数并使用该操作符。 
寻找最优匹配 
  
生成一个同名的操作符的列表。 
如果表中只有一个操作符:如果输入类型可以匹配或转换,则使用该操作符,否则输出一个错误。 
挑出具有最多显式的类型匹配的操作符.挑出所有没有显式的类型匹配的操作符并进行下一步.如果结果只有一个候选操作符,而且类型匹配或可转换.则使用之. 
如果输入参数是 "unknown", 将输入按布尔(boolean),数字(numeric),字符串(string),几何(geometric)或用户定义(user-defined)分类.如果分类结果有多种类型,或超过一种用户定义类型,则产生一个错误,因为在没有更多线索的条件下不能导出正确的选择.如果分类结果只有一类,则将先前"unknown"的类型转为"优选类型". 
挑出类型匹配最准确的和从前

[1] [2] [3]  下一页

[数据载入中...] [返回上一页] [打 印]