PostgreSQL failed IANA tz database BUG修复

    xiaoxiao2026-04-06  9

    背景

    PostgreSQL 可以使用IANA发布的时区数据库,但是由于IANA发布的数据库中,有些定义的时区别名并没有对应的时区。

    从而导致PG在解析对应别名时会报错。

    # select '2016-09-02 08:00:00 NOVST'::timestamptz; ERROR: time zone abbreviation "novst" is not used in time zone "Asia/Novosibirsk"

    查询pg_timezone_abbrevs函数返回所有的别名与时区对应关系,也会报错。

    postgres=# select pg_timezone_abbrevs (); ERROR: time zone abbreviation "novst" is not used in time zone "Asia/Novosibirsk"

    修复BUG

    在PostgreSQL的BUG报告中已经有在讨论这个问题

    https://www.postgresql.org/message-id/flat/20160902031551.15674.67337@wrigleys.postgresql.org#20160902031551.15674.67337@wrigleys.postgresql.org

    https://www.postgresql.org/message-id/flat/6189.1472820913@sss.pgh.pa.us#6189.1472820913@sss.pgh.pa.us

    TOM LANE提供了一个patch,可以避免出现以上问题。

    wget https://www.postgresql.org/message-id/attachment/45970/allow-timezone-abbrevs-not-matching-iana-data.patch cd postgresql-9.5.4 patch -p1 < ../allow-timezone-abbrevs-not-matching-iana-data.patch make -j 32 make install

    重启数据库,测试,如果时区别名不存在时区映射关系时,使用了本地时区。

    postgres=# select '2016-09-02 08:00:00 NOVST'::timestamptz; timestamptz ------------------------ 2016-09-02 09:00:00+08 (1 row)

    长期来看,等PG的内核修复。

    参考

    https://www.postgresql.org/message-id/flat/20160902031551.15674.67337@wrigleys.postgresql.org#20160902031551.15674.67337@wrigleys.postgresql.org

    https://www.postgresql.org/message-id/flat/6189.1472820913@sss.pgh.pa.us#6189.1472820913@sss.pgh.pa.us

    Count

    相关资源:python入门教程(PDF版)
    最新回复(0)