Можно ли обрабатывать поля Varbinary и Bytea одинаково? - PullRequest
2 голосов
/ 09 ноября 2011

Я переместил базу данных MySQL в 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-адрес (это большой двоичный объект / что-то)

Теперь, будет ли этот запрос хранить те же самые данные, если бы вместо этого было поле bytea?Я бы предположил, что да, но имеет ли место то же самое для оператора select?
т.е. будет ли этот запрос возвращать те же данные независимо от того, было ли поле ip varbinary или bytea?

SELECT userID, userName, userRole, channel ,ip FROM table

Спасибо за ваше время, хорошего дня.

Ответы [ 3 ]

6 голосов
/ 09 ноября 2011

Да, bytea эквивалентно varbinary / image / blob и др.При этом PostgreSQL стандартно поставляется с типом inet, который принимает адрес IPv4 в текстовом представлении и сохраняет его как 32-разрядное целое число.

1 голос
/ 09 ноября 2011

Postgres не поддерживает поля varbinary, и после некоторого исследования я обнаружил, что эквивалентом Postgres является bytea.

Итак, я сделал таблицы с байтами в качестве типа поля для ipстолбцы.

INET сделан для ip-адресов, IPv4 и IPv6, bytea сделан для двоичных данных.Всегда используйте наиболее подходящий тип данных, PostgreSQL имеет много отличных типов данных.И вы можете создавать свои собственные типы данных (TYPE или DOMAIN), если хотите.Но никогда не злоупотребляйте bytea только потому, что можете.

1 голос
/ 09 ноября 2011

IIRC, вы должны использовать функции pg_escape_bytea() и pg_unescape_bytea().

...