我可以等效地处理Varbinary和bytea字段吗?

时间:2011-11-08 21:45:40

标签: php mysql postgresql varbinary

我将mysql DB移动到Postgres,但是有些表有一个varbinary(16)字段(用于存储ip地址)。

Postgres不支持varbinary字段,经过一些研究后,我发现Postgres等效字段为bytea

所以,我继续使用bytea创建表作为ip列的字段类型。

现在,我不确定,但这个可能会给我带来麻烦。

所以,现在我的问题是byteavarbinary是否可以完全平等对待。 例如,如果原始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

感谢您的时间,祝您有个美好的一天。

3 个答案:

答案 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只是因为你可以。