Postgresql 中文操作指南

10.1. Overview #

SQL 是一种强类型的语言。也就是说,每个数据项都有一个关联的数据类型,该类型决定了该数据项的行为和允许的用法。PostgreSQL 具有一个可扩展类型系统,该类型系统比其他 SQL 实现更为通用和灵活。因此,PostgreSQL 中的大多数类型转换行为由常规规则(而不是临时启发式)控制。这允许使用混合类型表达式,即使与用户定义类型一起使用也是如此。

PostgreSQL 扫描器/解析器将词法元素分为五种基本类别:整数、非整数、字符串、标识符和关键字。大多数非数字类型常量首先被归类为字符串。SQL 语言定义允许使用字符串指定类型名称,并且这种机制可以在 PostgreSQL 中用于让解析器沿着正确路径启动。例如,查询:

SELECT text 'Origin' AS "label", point '(0,0)' AS "value";

 label  | value
--------+-------
 Origin | (0,0)
(1 row)

具有两个类型为 textpoint 的文字常量。如果不为字符串文字指定类型,则最初分配占位符类型 unknown,以便在稍后的阶段根据以下描述进行解析。

有四种基本 SQL 构造需要在 PostgreSQL 解析器中使用不同的类型转换规则:

  • Function calls

    • PostgreSQL 类型系统在很大程度上建立在一组丰富的函数之上。函数可以有一个或多个参数。由于 PostgreSQL 允许函数重载,因此函数名本身无法唯一标识要调用的函数;解析器必须根据提供的参数的数据类型选择正确的函数。

  • Operators

    • PostgreSQL 允许使用前缀(一个参数)运算符以及中缀(两个参数)运算符的表达式。与函数一样,运算符可以重载,所以存在选择正确运算符的同样问题。

  • Value Storage

    • SQL INSERTUPDATE 语句将表达式的结果放入表中。语句中的表达式必须与目标列的类型匹配(并且可能转换为目标列的类型)。

  • UNIONCASE 及相关构造

    • 由于联合 SELECT 语句的所有查询结果都必须出现在一组列中,每个 SELECT 子句的结果类型必须匹配并转换为统一格式。同样地,CASE 构造的结果表达式必须转换为公用类型,以便整个 CASE 表达式具有已知的输出类型。其他某些构造(例如 ARRAY[] 以及 GREATESTLEAST 函数)同样需要确定多个子表达式的公用类型。

系统目录会存储有关哪些转换或 casts 存在于哪些数据类型之间以及如何执行这些转换的信息。用户可以使用 CREATE CAST 命令添加其他转换。(这通常通过定义新的数据类型来完成。内置类型之间的转换集经过精心设计,最好不要进行更改。)

解析器提供的附加启发式方法允许在具有隐式转换的类型组之间更好地确定适当的类型转换行为。数据类型分为若干基本 type categories,包括 booleannumericstringbitstringdatetimetimespangeometricnetwork 和用户定义的类型。(有关列表,请参阅 Table 53.65;但请注意也可以创建自义类型类别。)每个类别中可能存在一个或多个 preferred types,当有多种可能的类型可供选择时,这些类型会被优先选择。通过精心选择首选类型和可用的隐式转换,可以确保用有用的方式解决模棱两可的表达式(具有多个备选解析解决方案的表达式)。

设计所有类型转换规则时都考虑了以下几个原则: