PostgreSQL | ||
---|---|---|
上一页 | 下一页 |
在大多数情况下,用户不需要明白类型转换机制的细节.但是,由 Postgres 所进行的隐含的类型转换会对查询的结果产生明显的影响,这些影响又可以由用户或程序员通过显式的类型转换进行剪裁利用.
本章介绍 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 分析器的习惯是:所有类型转换函数接受一个类型是源类型的参数,该参数与目标类型同名.任何符合这一标准的函数都被认为是一个有效的转换函数,因而可以被分析器当作转换函数使用.这个简单的假设令分析器在不需要写硬代码的基础上就可以充分利用类型转换的能力,也让用户定义的类型可以透明地使用同一特性.
分析器中还有一个搜索器用于更好地猜测 SQL 标准类型的确切特性.分析器里有五种定义的类型:布尔(boolean),字符串(string),数字(numeric),几何(geometric)和用户定义(user-defined). 除用户定义类型外,每种类型都有一种"优选类型"用于解决类型定义不明确的问题.每一个"用户定义"的类型就是其自身的"优选类型",所以那些含混不清的表达式(在分析结果中有多种可能的表达式) 如果只有一个用户定义类型则可以正确分析,而那些有多个用户定义类型的表达式会仍然是含糊的,因而会抛出分析错.
含糊的表达式如果其多种候选可能性都是同一种数据类型,则有可能被正确分析,而如果其候选可能性是几种数据类型,则分析很可能会报错,并要求用户将表达式明确化.
另外,如果一个查询通常使用某个函数进行隐含类型转换,而用户显式定义了一个有正确参数的函数,解释器应该使用新函数取代原先旧函数的隐含操作。
上一页 | 首页 | 下一页 |
IP V4 函数 | 开头 | 操作符 |