18.12. 版本和平台兼容性

18.12.1. 以前的 PostgreSQL 版本

array_nulls(boolean)

控制数组输入解析器是否将未用引号界定的NULL作为数组的 一个 NULL 元素。默认为on表示允许向数组中输入 NULL 值。 但 8.2 之前的版本不支持这么做,因此将把NULL当作字符 串"NULL"。如果希望向后兼容这种旧式行为,那么可以设 为off

即使该值被设为off也仍然能够创建包含 NULL 值的数组。

backslash_quote(enum)

控制字符串文本中的单引号是否能够用\'来表示。首选的符 合 SQL 标准的方法是将其双写(''),但是PostgreSQL 在历史上也可以用\'来表示。不过使用\' 容易导致安全漏洞,因为在某些多字节字符集(比如 GBK/GB18030)中存在 最后一个字节等于\'的 ASCII 值的字符。如果客户端代码 没有做到正确逃逸,那么将会导致 SQL 注入攻击。如果服务器拒绝 使用\'来表示单引号,那么就可以避免这种风险。 backslash_quote的可用值是on(总是允许), off(总是拒绝),safe_encoding(缺省, 仅在客户端字符集编码不会在多字节字符末尾包含\的 ASCII 值时允许)

需要注意的是,在字符串文本符合 SQL 标准的情况下,\ 没有任何其它含义。这个参数影响的是如何处理不符合标准的字符串文本, 包括明确的字符串逃逸语法(E'...')。

default_with_oids(boolean)

这个选项控制CREATE TABLECREATE TABLE AS 在既没有声明WITH OIDS也没有声明WITHOUT OIDS 的情况下,是否在新创建的表中包含 OID 字段。它还决定 SELECT INTO创建的表里面是否包含 OID 。 在PostgreSQL8.0 之后 default_with_o ids 缺省 为off。以前版本的 PostgreSQL 缺省为 on 。

我们反对在用户表中使用 OID ,因此大多数安装应该关闭这个变量。 需要 OID 的表应该在创建表的时候声明WITH OIDS

escape_string_warning(boolean)

打开的时候,如果在普通的字符串文本里(\语法)出现了 一个反斜扛'...'并且standard_conforming_strings 被关闭,那么就会发出一个警告。缺省是on. 。

应该使用逃逸字符串语法(E'...')来做逃逸,因为在将来 的 PostgreSQL 版本里,普通的字符串对待反斜扛的行为将与标准兼容。

lo_compat_privileges(boolean)

在9.0之前的版本中,大对象没有连接权限,并且对所有用户哦都市可读可写的。 将这个变量设置为on,从而禁用新的权限检查,以与以前的版本兼容。 默认是off

设置这个参数不会禁用所有跟大对象有关的安全检查;除了那些在PostgreSQL 9.0中已经修改了的性能。如,lo_import()lo_export() 需要超级用户权限独立设置。

sql_inheritance(boolean)

这个选项控制继承语义,尤其是在缺省时是否在各种命令里把子表包括进来。 如果设为off那么默认不包含字表(相当于默认使用 ONLY关键字)。这是为了兼容 7.1 之前版本而设置的。 参考节Section 5.8获取关于继承的更多信息。

standard_conforming_strings(boolean)

控制普通字符串文本('...')中是否按照 SQL 标准把反斜扛 当普通文本。缺省为 off ,表示反斜扛当作逃逸对待。将来的版本会把 这个设置的缺省值改成on,这样字符串文本的语法就变为 符合标准了。应用可以检查这个参数来判断字符串文本如何被处理。建议 明确使用逃逸字符串语法(E'...')来逃逸字符。

synchronize_seqscans(boolean)

它允许对大表的顺序扫描与其他同步,因此并发扫描会同时读相同的块, 因此共享I/O负载。当启用这个参数时,一个扫描会从表的中间开始,然后 "wrap around",以扫描所有的行,同时,同步已在进程中的活跃的扫描。 对于没有ORDER BY查询来说,这样的扫描会返回不可预料的顺序改变。 将这个参数设置为off以支持8.3之前的特性(顺序扫描通常从表的起始处开始)。 缺省是on

18.12.2. 平台和客户端兼容性

transform_null_equals(boolean)

如果打开,那么表达式expr= NULL(或NULL =expr) 将被当做exprIS NULL处理, 也就是说,如果expr得出 NULL 值则返回真, 否则返回假。正确的 SQL 标准兼容的expr= NULL 行为总是返回 NULL(未知)。因此这个选项缺省是off

不过,在Microsoft Access里的过滤表单 生成的查询好像使用的是expr= NULL 测试 NULL ,因此,如果你使用这个界面访问数据库,你可能想把这个选项 打开。因为形如expr= NULL的表达式 总是返回 NULL ,它们在应用中也不常见,因此这个选项实际上没有什么害处。 但是新用户常常在涉及 NULL 的表达式语义上感到胡涂,因此缺省时不打开 这个选项。

请注意这个选项只影响= NULL形式,不包括其它比较操作符 或者其它与一些涉及等号操作符的表达式计算(比如 IN)。因此,这个选项不 是垃圾程序的狗皮膏药。

请参考节Section 9.2获取相关信息。