Какой тип столбца mysql для сериализации (данных)?

Я сериализую много массивов в php, которые должны храниться в базе данных с помощью mysql.

Длина окончательной строки может сильно отличаться от чего-либо между 2000 и 100 000+, мне было интересно, какой будет лучший тип столбца для этого?

В настоящее время я настроен как LONGTEXT, но я чувствую, что это слишком много! База данных уже активна и имеет около 3 миллионов строк, это новый столбец, который будет добавлен в ближайшее время.

Спасибо

Ответ 1

Всегда используйте BLOB тип данных для сериализации данных, чтобы он не прерывался и прерывал сериализацию двоично-безопасным способом. Если максимальная длина конечной строки невелика, вам понадобится LONGBLOB. Если вы знаете, что данные не заполнят 2 ^ 24 символа, вы можете использовать MEDIUMBLOB. MEDIUMBLOB составляет около 16 МБ, а LONGBLOB - около 4 ГБ, поэтому я бы сказал, что ваш довольно безопасный с MEDIUMBLOB.

Почему двоичный тип данных? Текстовые типы данных в Mysql имеют кодировку. Кодировка символов будет влиять на то, как сериализованные данные переносятся между различными кодировками. Например. при сохранении в качестве латинского-1, но затем считывается как UTF-8 (например, из-за настройки кодировки соединения с драйвером базы данных), сериализованные данные могут быть разбиты, потому что бинарные смещения сдвигались, однако сериализованные данные не были закодированы для таких сдвигов. Сериализованные строки PHP являются двоичными данными, а не с какой-либо конкретной кодировкой.

Ответ 2

Вы должны выбрать BLOB (как указано в Marc B) в руководстве PHP для serialize():

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

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

Конечно, следует учитывать и данные J.Money о размерах, даже если у BLOB есть свои пределы, и если вы собираетесь их превышать, вам понадобится MEDIUMBLOB или LONGBLOB.