|
5.2. 概述SQL 是强类型语言。 也就是说,每一数据都与一个决定其行为和可行用法的数据类型相联。 PostgreSQL 有一个可扩展的数据类型系统, 该系统比其他 RDBMS 对应 系统的实现更具通用性和灵活性。 因而, PostgreSQL 中 大多数类型转换的特性应该是由通用规则来管理的, 而不是由专门搜索方法来分析, 以此令混合类型表达式有实际意义, 即便是用户定义的类型也如此。 PostgreSQL 扫描/分析器只将词法元素分解成五个基本种类: 整数(integers),浮点数(floating-point numbers), 字符串(strings),名字(names)和关键字 (keywords). 大多数扩展的类型首先表征为字符串(strings). SQL 语言的定义允许将类型名声明为字符串,这个机制被 PostgreSQL 用于令分析器沿着正确 的方向运行.例如,下面查询 tgl=> SELECT text 'Origin' AS "Label", point '(0,0)' AS "Value"; Label | Value --------+------- Origin | (0,0) (1 row) 有两个文本常量,类型分别为 text 和 point . 如果没有为字串文本声明类型, (该文本)先被初始化成一个拥有存储空间的 unknown (未知)类型, 该类型将在后面描述的晚期阶段分析. 在 PostgreSQL 分析器里, 有四种基本的 SQL 元素需要独立的类型转换规则:
许多通用的类型转换规则使用建立在 PostgreSQL 函数和操作符系统表基础上的简单转换来实现. 在转换规则中包括了一些启发方法,以便更好的支持 SQL 标准中的传统的内置类型,像 smallint , integer ,和 real . PostgreSQL 分析器的习惯是: 所有类型转换函数接受一个类型是源类型的参数,该参数与目标类型同名. 任何符合这一标准的函数都被认为是一个有效的转换函数, 因而可以被分析器当作转换函数使用.这个简单的假设令分析器在不需要写硬代 码的基础上就可以充分利用类型转换的能力, 也让用户定义的类型可以透明地使用同一特性. 分析器中还有一个搜索器用于更好地猜测 SQL 标准类型的确切特性. 分析器里定义了几种 类型范畴 : boolean , numeric , string , bitstring , datetime , timespan , geometric , network ,和用户定义(user-defined). 除用户定义类型外, 每种类型都有一种 优选类型 用于解决类型定义歧义的问题. 每一个"用户定义"的类型就是其自身的"优选类型",所以那些含混不清的 表达式(在分析结果中有多种可能的表达式) 如果有多个内置类型的时候大多可以正确分析,但如果有多个用户定义类型 可选,则会抛出错. 所有类型转换规则都是建立在下面几个基本原则上的:
|