Подтвердить что ты не робот

Какой тип столбца следует использовать для хранения сериализованных данных в mysql db?

Какой тип столбца следует использовать для хранения сериализованных данных в mysql db? Я знаю, что вы можете использовать varbinary, blob, text. Что считается лучшим и почему?

Изменить: Я понимаю, что это не "хорошо" для хранения сериализованных данных. Мне нужно сделать это в этом одном случае. Пожалуйста, просто поверьте мне об этом и сосредоточьтесь на вопросе, если у вас есть ответ. Спасибо!

4b9b3361

Ответ 1

Ответ: текст устарел во многих СУБД, кажется, лучше использовать либо blob, либо varchar с высоким лимитом (и с blob вы не получите никаких проблем с кодировкой, что является серьезной проблемой с varchar и текст).

Также, как указано в этот поток на форумах MySQL, жесткие диски дешевле, чем программное обеспечение, поэтому вам лучше сначала создать свое программное обеспечение и заставить его работать, и только тогда, когда пространство станет проблемой, вы можете оптимизировать этот аспект. Поэтому не пытайтесь переопределить размер столбца слишком рано, лучше сначала установите размер по размеру (плюс это позволит избежать проблем с безопасностью).

О различных комментариях: Здесь слишком много фанатизма SQL. Несмотря на то, что я очень люблю SQL и реляционные модели, у них также есть свои подводные камни.

Сохранение сериализованных данных в базе данных как есть (например, сохранение данных в формате JSON или XML) имеет несколько преимуществ:

  • У вас может быть более гибкий формат для ваших данных: добавление и удаление полей "на лету", изменение спецификации полей "на лету" и т.д.
  • Меньшее несоответствие импеданса с моделью объекта: вы сохраняете и получаете данные так же, как и в вашей программе, по сравнению с извлечением данных, а затем должны обрабатывать и преобразовывать их между структурами ваших программных объектов и структурами реляционных баз данных.

И есть еще много других преимуществ, поэтому, пожалуйста, нет фанатизма: реляционные базы данных - отличный инструмент, но не позволяйте нам использовать другие инструменты, которые мы можем получить. Больше инструментов, тем лучше.

Что касается конкретного примера использования, я стараюсь добавить в мою базу данных JSON-поле для хранения дополнительных параметров записи, где столбцы (свойства) данных JSON никогда не будут SELECT'd индивидуально, но используются только тогда, когда правая запись уже выбрана. В этом случае я могу по-прежнему различать свои записи реляционными столбцами, и когда выбрана правильная запись, я могу просто использовать дополнительные параметры для любой цели, которую хочу.

Поэтому мой совет по сохранению лучшего из обоих мировых (скорость, сериализуемость и структурная гибкость), просто используйте несколько стандартных реляционных столбцов, чтобы служить уникальными ключами для различения между вашими строками, а затем использовать столбец blob/varchar, где ваш сериализованные данные будут вставлены. Обычно для уникального ключа требуется только два/три столбца, поэтому это не будет значительным издержками.

Кроме того, вас может заинтересовать PostgreSQL, у которого теперь есть тип данных JSON, и PostSQL project, чтобы напрямую обрабатывать поля JSON так же, как реляционные столбцы.

Ответ 2

Сколько вы планируете хранить? Ознакомьтесь с спецификациями для типов в документах MySQL и их размеры. Ключевым моментом здесь является то, что вам не нужно индексировать этот столбец, но вы также никогда не хотите, чтобы он переполнялся и усекался, так как тогда вы JSON не читаются.

  • TINYTEXT L < 2 ^ 8
  • ТЕКСТ L < 2 ^ 16
  • MEDIUMTEXT L < 2 ^ 24
  • LONGTEXT L < 2 ^ 32

Где L - длина символа

Просто обычный текст должен быть достаточным, но больше, если вы храните больше. Хотя в этом случае вы, возможно, не захотите хранить его в db.

Ответ 3

LONGTEXT

Wordpress хранит сериализованные данные в таблице postmeta как LONGTEXT. Я считаю, что база данных Wordpress является хорошим местом для исследования типов данных для столбцов.

Ответ 4

Ограничения длины, упомянутые в @Twisted Pear, являются вескими причинами.

Также учтите, что TEXT и его ilk имеют charset, связанный с ними, тогда как BLOB типы данных этого не делают. Если вы просто храните необработанные байты данных, вы можете использовать BLOB вместо TEXT.

Обратите внимание, что вы все еще можете хранить текстовые данные в BLOB, вы просто не можете выполнять какие-либо операции SQL на нем, которые учитывают кодировку; это просто байты для SQL. Но это, вероятно, не проблема в вашем случае, поскольку в любом случае она сериализует данные со структурой, неизвестной SQL. Все, что вам нужно сделать, это хранить байты и извлекать байты. Интерпретация байтов зависит от вашего приложения.

У меня также были проблемы с использованием LONGBLOB или LONGTEXT с использованием определенных клиентских библиотек (например, PHP), потому что клиент пытается выделить буфер размером с наибольший возможный тип данных, не зная, насколько велик контент любая строка, пока она не появится. Это заставило PHP разразиться огнем, поскольку он попытался выделить буфер 4 ГБ. Я не знаю, какой клиент вы используете, или он страдает от того же поведения.

Обходной путь: используйте MEDIUMBLOB или просто BLOB, если эти типы достаточны для хранения сериализованных данных.


Что касается людей, которые говорят вам не делать этого, я не буду говорить вам это (несмотря на то, что я сторонник SQL). Правда, вы не можете использовать выражения SQL для выполнения операций над отдельными элементами в сериализованных данных, но это не ваша цель. Что вы делаете, добавив эти данные в базу данных:

  • Связать сериализованные данные с другими реляционными данными.
  • Возможность сохранять и извлекать сериализованные данные в соответствии с областью транзакций, COMMIT, ROLLBACK.
  • Храните все ваши реляционные и нереляционные данные в одном месте, чтобы упростить репликацию на ведомые устройства, резервное копирование и восстановление и т.д.

Ответ 6

Возможно, я опоздал на вечеринку, но документация php.net о сериализованном объекте гласит следующее:

Обратите внимание, что это двоичная строка, которая может содержать нулевые байты, и необходимо хранить и обрабатывать как таковые. Например, serialize() вывод обычно должен храниться в поле BLOB в базе данных, а не поле CHAR или TEXT.

Источник: http://php.net/manual/en/function.serialize.php

Надеюсь, что это поможет!

Ответ 7

Если сериализованные данные не имеют другого использования, кроме как быть сохранены и восстановлены из базы данных, вы, вероятно, не захотите делать это таким образом.

Как правило, сериализованные данные имеют несколько полей, которые должны храниться в базе данных как отдельные столбцы. Для каждого элемента сериализованных данных является общим столбцом. Некоторые из этих столбцов, естественно, являются ключевыми областями. Дополнительные столбцы могут быть добавлены помимо данных, чтобы указать дату + время, когда произошла вставка, ответственный пользователь и т.д. И т.д.

Ответ 8

Я нашел:

varchar(5000)

чтобы быть лучшим балансом размера/скорости для нас. Кроме того, он работает с реляционными данными 3 serialize (varbinary), периодически прерывая сериализацию ошибок.