Сохранить массив в базу данных

rafaello

Новичок
Здравствуйте!
Есть массив, где количество элементов может быть до 100 - 150 тысяч.
PHP:
$recipients = array(10500, 10502, 10505, 10510, 10520, 10523, ...);
Необходимо сохранить этот массив в базу данных mysql.
Испробовал разные варианты, но везде выходит ошибка. Я так думаю, что ошибка из-за того, что массив уж очень большой. Вот что я пробовал:
1 вариант
PHP:
$xyz = serialize($recipients);
$query = 'INSERT INTO ... VALUES("'.$xyz.'", ...)';
.....
$query = 'SELECT `xyz`, ... FROM ...';
.....
$recipients = unserialize($xyz);
Вот на этой строке выходит ошибка:
PHP:
PHP Notice:  unserialize(): Error at offset 65531 of 65535 bytes in
Пробовал так:
PHP:
$xyz = base64_encode(serialize($recipients));
$recipients = unserialize(base64_decode($xyz));
Все равно выходит та же ошибка
2 вариант
PHP:
$xyz = json_encode($recipients);
$recipients = json_decode($xyz);
ошибки не выводит, но строка в массив не превращается, а остается строкой.

Подскажите, как же можно сохранить массив с большим количеством элементов в базу данных так, чтобы его снова вытащить и превратить обратно в массив?
 

WMix

герр M:)ller
Партнер клуба
есть еще implode, explode если что
base64 и serialize это гонишь. json_encode имеет смысл если JSON_TYPE пользовать.
а вообще, по основной идеи табличных баз данных, надо значение на строку записывать

твоя ошибка может возникать если поле в базе слишком маленькое
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
@rafaello, если есть 150 тысяч значений в массиве - значит должно быть 150 тысяч строк в таблице в базе. Не надо извращаться с сериализацией и кодированием. Сделай в лоб.
 

Adelf

Administrator
Команда форума
PHP Notice: unserialize(): Error at offset 65531 of 65535 bytes in
Это говорит о том, что ты используешь в базе тип поля TEXT. А он вмещает как раз только 65536 байт. Надо LONGTEXT. Ну или как парни говорят выше.
 

rafaello

Новичок
Действительно, век живи, век учись. Дело решилось заменой типа поля с TEXT на LONGTEXT. Ура!!!
А теперь возникает вопрос.
С точки зрения экономии памяти, если значений массива более 100 тысяч, какой из вариантов лучше:
1. Вставлять в лоб, каждое значение на новую строку в таблице
2. Использовать serialize() и тип поля LONGTEXT
Спасибо заранее...
 

AnrDaemon

Продвинутый новичок
Первое естественно.
Ты же не весь масси постоянно туда-сюда таскаешь?…
 

Adelf

Administrator
Команда форума
Я бы вероятно вообще в файлах держал бы эти данные. смысл их в базе держать...
 

Вурдалак

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

А просто рассуждать на тему «у меня тут есть непонятный массив, где его лучше хранить: в файлах, в базе» особо не имеет смысла.

По названию переменной (recipients) можно сделать вывод, что это что-то вроде подписок со списком получателей. Как будет в таком случае происходить отписка, если ты хранишь данные в base64?
 
Сверху