PostgreSql - 在数据库迁移期间转换为 cidr

PostgreSql - Cast to cidr during database migration

我是法国人。所以,为我的错误道歉!

我正在通过 pgAdmin4 在 PostgreSql 9.6 上进行数据库迁移,第一个有一个 CHARACTER VARYING 类型字段,另一个是 CIDR 类型字段。 我使用这个命令:

INSERT INTO ip.cidr (cid_id, cid_res_id, cid_cidr)
SELECT a, b, network(c) FROM dblink('host=xxx user=xxx password=xxx dbname=xxx', 'SELECT ipp_id, res_id, ipp_ipcidr FROM public.ipplage')
AS x(a integer, b integer, c cidr)

但它不起作用! 这是错误:

ERREUR: invalid cidr value : « 10.26.3.0/23 » DETAIL: The value has bits positioned to the right of the mask. ********** Error ********** ERREUR: invalid cidr value : « 10.26.3.0/23 » SQL state: 22P02 Detail: The value has bits positioned to the right of the mask.

错误是法语。我自己翻译的

我尝试将 varchar 转换为 cidr,但它不起作用!同样的错误! 我到处搜索以了解如何将这个 f*****g CHARACTER VARYING 转换为 CIDR 类型,但没有结果!请 !!!帮我 ! :(

这是因为10.26.3.0/23不是网络地址。 10.26.2.0/23 是。

所以你有两个选择,这取决于你想保留哪些信息:

INSERT INTO ip.cidr (cid_id, cid_res_id, cid_cidr)
SELECT a, b, network(c) FROM dblink('host=xxx user=xxx password=xxx dbname=xxx', 'SELECT ipp_id, res_id, ipp_ipcidr::inet::cidr FROM public.ipplage')
AS x(a integer, b integer, c cidr)

这将网络地址转换为 inet,然后找到 inet 的网络地址。

或者,如果您想保留您的地址:

INSERT INTO ip.cidr (cid_id, cid_res_id, cid_cidr)
SELECT a, b, network(c) FROM dblink('host=xxx user=xxx password=xxx dbname=xxx', 'SELECT ipp_id, res_id, ipp_ipcidr FROM public.ipplage')
AS x(a integer, b integer, c inet)

如果您想了解更多信息:https://www.postgresql.org/docs/9.6/static/datatype-net-types.html

编辑:顺便说一句,如果你想用简单的英语而不是法语来表达你的错误(我是法国人并且遇到了同样的问题;-)你可以在 postgresql.conf 中注释掉这几行:

default_text_search_config = 'pg_catalog.french'