19.13. 版本和平台兼容性

19 .13.1. 先前的 PostgreSQL 版本

  • array_nulls ( boolean )
    • 这控制着数组 Importing 解析器是否将未引号NULL识别为指定空数组元素。默认情况下,该值为on,允许 Importing 包含空值的数组值。但是,PostgreSQL 8.2 之前的版本不支持数组中的空值,因此会将NULL视为使用字符串值“ NULL”指定普通数组元素。为了与需要旧行为的应用程序向后兼容,可以将此变量设置为off

请注意,即使此变量为off,也可以创建包含空值的数组值。

  • backslash_quote ( enum )
    • 这控制着引号是否可以由字符串 Literals 中的\'表示。表示引号的首选 SQL 标准方法是将其加倍(''),但是 PostgreSQL 历史上也接受\'。但是,使用\'会带来安全风险,因为在某些 Client 端字符集编码中,存在多字节字符,其中最后一个字节在数值上与 ASCII \等价。如果 Client 端代码确实错误转义,则可能会发生 SQL 注入攻击。通过使服务器拒绝其中引号似乎被反斜杠转义的查询,可以避免这种风险。 backslash_quote的允许值为on(始终允许\'),off(始终拒绝)和safe_encoding(仅当 Client 端编码不允许多字节字符内的 ASCII \时允许)。 safe_encoding是默认设置。

请注意,在符合标准的字符串 Literals 中,\始终表示\。此参数仅影响对不符合标准的 Literals 的处理,包括转义字符串语法(E'...')。

  • default_with_oids ( boolean )
    • 如果未指定WITH OIDSWITHOUT OIDS,则此参数控制CREATE TABLECREATE TABLE AS是否在新创建的表中包括 OID 列。它还确定 OID 是否将包含在SELECT INTO创建的表中。参数默认为off;在 PostgreSQL 8.0 和更早的版本中,默认为on

不建议在用户表中使用 OID,因此大多数安装应禁用此变量。需要特定表的 OID 的应用程序在创建表时应指定WITH OIDS。可以启用此变量以与不遵循此行为的旧应用程序兼容。

  • escape_string_warning ( boolean )
    • 启用时,如果普通字符串 Literals('...'语法)中出现反斜杠(\)并且standard_conforming_strings处于关闭状态,则会发出警告。默认值为on

希望将反斜杠用作转义的应用程序应修改为使用转义字符串语法(E'...'),因为根据 SQL 标准,普通字符串的默认行为现在是将反斜杠视为普通字符。可以启用此变量来帮助查找需要更改的代码。

  • lo_compat_privileges ( boolean )
    • 在 9.0 之前的 PostgreSQL 版本中,大对象没有访问权限,因此,所有用户始终可以读取和写入。将此变量设置为on将禁用新的特权检查,以与以前的版本兼容。默认值为off。只有超级用户可以更改此设置。

设置此变量不会禁用与大对象相关的所有安全检查,仅禁用那些默认行为在 PostgreSQL 9.0 中已更改的安全检查。例如,不管此设置如何,lo_import()lo_export()都需要超级用户特权。

  • operator_precedence_warning ( boolean )
    • 启用后,解析器将针对自 PostgreSQL 9.4 起由于运算符优先级更改而可能含义发生变化的任何构造发出警告。这对于审核应用程序以查看优先级更改是否破坏了任何内容很有用;但是它并不意味着在 Producing 保持打开状态,因为它会警告一些完全有效,符合标准的 SQL 代码。默认值为off

有关更多信息,请参见Section 4.1.6

  • quote_all_identifiers ( boolean )

    • 当数据库生成 SQL 时,即使不是(当前)关键字,也要强制所有标识符加引号。这将影响EXPLAIN的输出以及pg_get_viewdef之类的函数的结果。另请参见pg_dumppg_dumpall--quote-all-identifiers选项。
  • standard_conforming_strings ( boolean )

    • 这可以控制普通字符串 Literals('...')是否按照 SQL 标准指定的方式按字面对待反斜杠。从 PostgreSQL 9.1 开始,默认值为on(以前的版本默认为off)。应用程序可以检查此参数以确定如何处理字符串 Literals。此参数的存在也可以用作表明支持转义字符串语法(E'...')。如果应用程序希望将反斜杠视为转义字符,则应使用转义字符串语法(Section 4.1.2.2)。
  • synchronize_seqscans ( boolean )

    • 这允许对大型表进行 Sequences 扫描以使其彼此同步,从而使并发扫描大约在同一时间读取同一块,从而分担了 I/O 工作量。启用此功能后,扫描可能会从表的中间开始,然后“绕回”末端以覆盖所有行,以便与正在进行的扫描活动保持同步。这可能会导致没有ORDER BY子句的查询返回的行 Sequences 发生不可预测的变化。将此参数设置为off可确保 8.3 版之前的行为始终从表的开头开始进行 Sequences 扫描。默认值为on

19 .13.2. 平台和 Client 端兼容性

  • transform_null_equals ( boolean )
    • 启用时,格式为expr = NULL(或NULL = expr)的表达式被视为expr IS NULL,即,如果* expr *计算为空值,则它们返回 true,否则返回 false。 expr = NULL的正确的符合 SQL 规范的行为是始终返回 null(未知)。因此,此参数默认为off

但是,Microsoft Access 中过滤的表单会生成查询,这些查询似乎使用expr = NULL来测试空值,因此,如果您使用该接口访问数据库,则可能需要打开此选项。由于形式expr = NULL的表达式始终返回空值(使用 SQL 标准解释),因此它们不是很有用,并且在普通应用程序中不经常出现,因此此选项在实践中几乎没有危害。但是新用户经常对涉及空值的表达式的语义感到困惑,因此默认情况下此选项处于关闭状态。

请注意,此选项仅影响精确的形式= NULL,而不影响其他比较运算符或与包含 equals 运算符的某些表达式在计算上等效的其他表达式(例如IN)。因此,此选项不是错误编程的一般解决方案。

有关相关信息,请参阅Section 9.2