🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# 18.13\. 版本和平台兼容性 ## 18.13.1\. 以前的PostgreSQL版本 `array_nulls` (`boolean`) 控制数组输入解析器是否将未用引号界定的`NULL`作为数组的一个NULL元素。 默认为`on`表示允许向数组中输入NULL值。但8.2之前的PostgreSQL版本不支持这么做, 因此将把`NULL`当作字符串"NULL"。如果希望向后兼容这种旧式行为, 那么可以设为`off`。 即使该值被设为`off`也仍然能够创建包含NULL值的数组。 `backslash_quote` (`enum`) 控制字符串文本中的单引号是否能够用`\'`来表示。 首选的符合SQL标准的方法是将其双写(`''`),但是PostgreSQL 在历史上也可以用`\'`来表示。 不过使用`\'`容易导致安全漏洞, 因为在某些多字节字符集中存在最后一个字节等于`\`的 ASCII 值的字符。 如果客户端代码没有做到正确逃逸,那么将会导致SQL注入攻击。 如果服务器拒绝使用反斜杠逃逸来表示单引号的查询,那么就可以避免这种风险。 `backslash_quote`的可用值是`on`(总是允许`\'`), `off`(总是拒绝), `safe_encoding` (仅在客户端字符集编码不会在多字节字符末尾包含`\`的ASCII值时允许)。 `safe_encoding`是缺省设置。 需要注意的是,在字符串文本符合SQL标准的情况下,`\`没有任何其它含义。 这个参数影响的只是如何处理不符合标准的字符串文本, 包括明确的字符串逃逸语法(`E'...'`)。 `default_with_oids` (`boolean`) 这个选项控制`CREATE TABLE`和 `CREATE TABLE AS`在既没有声明`WITH OIDS` 也没有声明`WITHOUT OIDS`的情况下, 是否在新创建的表中包含OID字段。它还决定`SELECT INTO`创建的表里面是否包含OID。 参数缺省是`off`;在PostgreSQL 8.0之前缺省为on。 我们反对在用户表中使用 OID ,因此大多数安装应该关闭这个变量。 需要OID的表应该在创建表的时候声明`WITH OIDS`。 启用这个变量可以与不遵循这一行为的旧的应用程序兼容。 `escape_string_warning` (`boolean`) 打开的时候,如果在普通的字符串文本里(`'...'`语法)出现了一个反斜扛(`\`)并且 `standard_conforming_strings`被关闭,那么就会发出一个警告。缺省是`on`。 想要使用反斜杠作为逃逸的应用程序 应该使用逃逸字符串语法(`E'...'`)进行修改, 因为通的字符串缺省行为作为普通字符的反斜扛对待。 启动这个变量帮助找到需要修改的代码。 `lo_compat_privileges` (`boolean`) 在PostgreSQL9.0之前,大对象没有访问权限,因此,总是被所有用户可读可写。 设置这个变量到`on`禁用新权限检查,为了兼容先前版本。 缺省是`off`。只要超级用户可以改变此设置。 设置这些变量不会禁用所有与大对象相关的安全检查—仅仅是在PostgreSQL 9.0 已经改变了的缺省操作。比如,`lo_import()` 和`lo_export()` 不管这些设置都需要超级用户权限。 `quote_all_identifiers` (`boolean`) 当数据库生成SQL,强制引用所有标示符,即使它们(当前)不是关键字。这也将影响 `EXPLAIN`的输出以及像`pg_get_viewdef`函数的结果。 参见[pg_dump](#calibre_link-437)和[pg_dumpall](#calibre_link-439)的`--quote-all-identifiers` 选项。 `sql_inheritance` (`boolean`) 这个设置控制着未修饰的表引用是否包含继承的子表。缺省是`on`, 这意味着包含子表(因此,缺省假定`*`后缀)。如果返回`off`, 则不包含子表(因此,假定`ONLY`前缀)。SQL标准需要包含子表。 因此`off` 设置不符合规范,但是它提供了PostgreSQL 7.1版本之前的兼容性。 参见[Section 5.8](#calibre_link-1041)获取更多详细信息。 不赞成关闭`sql_inheritance`,因为发现操作有错误而且违反SQL标准。 关于继承操作的讨论在手册中通常假定它是`on`。 `standard_conforming_strings` (`boolean`) 控制普通字符串文本(`'...'`)中是否按照SQL标准把反斜扛当普通文本。 PostgreSQL 9.1开始,缺省是`on`( 之前缺省是`off`)。 应用可以检查这个参数来判断字符串文本如何被处理。 这个参数的出现也建议明确使用逃逸字符串语法(`E'...'`)来逃逸字符。 如果应用希望反斜杠作为逃逸字符对待,则使用逃逸字符串语法([Section 4.1.2.2](#calibre_link-1062))。 `synchronize_seqscans` (`boolean`) 这允许大表进行顺序扫描以同步其他的,所以并发扫描读取同一时间的同一批, 从而共享I/O负载。启用此功能后,扫描可能会在表中间开始, 然后"包装开始环绕"以覆盖所有的行, 从而同步已在进行的扫描活动。 这可能导致没有`ORDER BY`子句的查询返回排序行的不可预测变化。 设置这个参数为`off`确保预8.3行为, 其中一个顺序扫描总是从表的开头开始。缺省是`on`。 ## 18.13.2\. 平台和客户端兼容 `transform_null_equals` (`boolean`) 如果打开,那么表达式`_expr_` = NULL 或者`NULL =` `_expr_`将被当做`_expr_` IS NULL处理, 也就是说,如果`_expr_`得出 NULL 值则返回真,否则返回假。 正确的 SQL 标准兼容的`_expr_` = NULL行为总是返回NULL(未知)。 因此这个选项缺省是`off`。 不过,在Microsoft Access里的过滤表单生成的查询好像使用的是 `_expr_` = NULL测试 NULL ,因此, 如果你使用这个界面访问数据库,你可能想把这个选项打开。 因为形如`_expr_` = NULL的表达式总是返回NULL(使用SQL标准说明), 它们不是很有用而且在应用中也不常见, 因此这个选项实际上没有什么害处。但是新用户常常在涉及NULL的表达式语义上感到糊涂, 因此缺省时不打开这个选项。 请注意这个选项只影响`= NULL`形式, 不包括其它比较操作符或者其它与一些涉及等号操作符的表达式计算(比如`IN`)。 因此,这个选项不是垃圾程序的普遍修复。 请参考[Section 9.2](#calibre_link-1516)获取相关信息。