我将mysql DB移动到Postgres,但是有些表有一个varbinary(16)
字段(用于存储ip地址)。
Postgres不支持varbinary
字段,经过一些研究后,我发现Postgres等效字段为bytea
。
所以,我继续使用bytea
创建表作为ip列的字段类型。
现在,我不确定,但这个可能会给我带来麻烦。
所以,现在我的问题是bytea
和varbinary
是否可以完全平等对待。
例如,如果原始MySQL查询是:
INSERT INTO messages(userID, userName, userRole, dateTime, ip, text)
Values('21212111','bot','4',NOW(), inet_pton($ip), 'hi');
注意:我在那里包含了一些php,因为我的日志没有显示插入的ip地址是什么(这是一个blob /东西)
现在,如果该查询是bytea
字段,那么此查询是否会存储完全相同的数据?我会推测是的,但对于一个选择语句也是如此吗?
即,无论ip字段是varbinary
还是bytea
,此查询都会返回相同的数据?
SELECT userID, userName, userRole, channel ,ip FROM table
感谢您的时间,祝您有个美好的一天。
答案 0 :(得分:6)
是的,bytea
相当于varbinary
/ image
/ blob
等。话虽如此,PostgreSQL确实标配inet
类型,它将采用文本表示形式的IPv4地址并将其存储为32位整数。
答案 1 :(得分:1)
IIRC,您必须使用pg_escape_bytea()
和pg_unescape_bytea()
函数。
答案 2 :(得分:1)
Postgres不支持varbinary字段,经过一些研究,我 发现Postgres等价物是bytea。
所以,我继续使用bytea作为字段类型的表 ip列。
INET用于ip-address,IPv4和IPv6,bytea用于二进制数据。总是使用最匹配的数据类型,PostgreSQL有很多很棒的数据类型。如果需要,您可以创建自己的数据类型(TYPE或DOMAIN)。但是永远不要滥用bytea只是因为你可以。