mysql массив в поле

Сохранить массив PHP в MySQL?

Что такое хороший способ сохранить массив данных в одном поле MySQL?

Кроме того, как только я запрашиваю этот массив в таблице mysql, каков хороший способ вернуть его в форму массива?

Является ли сериализация и десериализация ответ?

Решение

Здесь нет хорошо способ сохранить массив в одном поле.

Вам необходимо проверить ваши реляционные данные и внести соответствующие изменения в вашу схему. Смотрите пример ниже для ссылки на этот подход.

если ты должен сохранить массив в одном поле, а затем serialize() а также unserialize() функции сделают свое дело. Но вы не можете выполнять запросы по фактическому содержанию.

Рассмотрим следующий массив

Чтобы сохранить его в базе данных, вам нужно создать такую ​​таблицу

Для работы с записями вы можете выполнять такие запросы (и да, это пример, будьте осторожны!)

connect() функция возвращает ресурс подключения MySQL

Другие решения

Как правило, да, сериализация и десериализация — это путь.

Однако если ваши данные просты, сохранение в виде строки, разделенной запятыми, вероятно, будет лучше для места хранения. Если вы знаете, что ваш массив будет просто списком чисел, например, вам следует использовать implode / explode. Это разница между 1,2,3 а также a:3: ,

Если нет, то сериализуйте и десериализуйте работу для всех случаев.

Лучший способ, который я нашел для себя, — это сохранить массив в виде строки данных с символами-разделителями.

Затем вы можете искать данные, хранящиеся в вашем массиве с помощью простого запроса

используйте функцию explode () для преобразования строки «array_data» в массив

обратите внимание, что это не работает с многомерными массивами, и убедитесь, что ваш «array_separator» уникален и не существует в значениях массива.

Сериализация / Unserialize массив для хранения в БД

Из руководства по PHP:

Смотрите в разделе «Возврат» на странице

Возвращает строку, содержащую представление значения в байтовом потоке, которое может храниться где угодно.

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

Примечание. Если вы хотите сохранить html в блобе, обязательно закодируйте его в base64, иначе он может нарушить функцию сериализации.

$YourSerializedData теперь готов к хранению в BLOB-объектах.

После получения данных из BLOB-объекта необходимо выполнить base64_decode, а затем удалить его.
Пример декодирования:

Просто используйте функцию сериализации PHP:

Однако, если вы используете простые массивы, подобные этому, вы также можете использовать implode и explode. Используйте пустой массив вместо new.

Сериализация и десериализация довольно распространены для этого. Вы также можете использовать JSON через json_encode и json_decode для менее специфичного для PHP формата.

Как упоминалось ранее — если вам не нужно искать данные в массиве, вы можете использовать serialize — но это «только php». Поэтому я бы рекомендовал использовать json_decode / json_encode — не только для производительности, но и для портативности!

Э-э, я не знаю, почему все предлагают сериализовать массив.

Я говорю, что лучший способ — это встроить его в схему базы данных. Я понятия не имею (и вы не дали никаких подсказок) о фактическом семантическом значении данных в вашем массиве, но обычно есть два способа хранения таких последовательностей

Таким образом, вы храните свой массив в одной строке.

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

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

В любом случае, любой из этих методов получает явное преимущество, заключающееся в возможности доступа к произвольному элементу последовательности, и вам не нужно беспокоиться о сериализации массивов и подобных уродливых вещах.

Что касается получения его обратно. Ну, получите соответствующую строку / последовательность строк с запросом и, ну, используйте петля.. право?

Источник

Как хранить массивы в MySQL?

у меня есть две таблицы в MySQL. Человека таблица имеет следующие столбцы:

на fruits столбец может содержать null или массив строк, таких как (‘apple’,’ orange’,’ banana’) или (‘strawberry’) и т. д. Вторая таблица-таблица фруктов и имеет следующие три столбца:

Итак, как я должен проектировать fruits столбец в первой таблице, чтобы он мог содержать массив строк, которые принимают значения из fruit_name столбец во второй таблице? Так как есть нет типа данных массива в MySQL, как я должен это сделать?

7 ответов

правильный способ сделать это-использовать несколько таблиц и JOIN их в запросах.

Читайте также:  sea grey met код краски ford

на person_fruit таблица содержит одну строку для каждого плода, с которым связан человек, и эффективно связывает person и fruits таблицы вместе, т. е.

когда вы хотите получить человека и все его плоды, вы можете сделать что-то вроде этого:

причина того, что в SQL нет массивов, заключается в том, что большинству людей это действительно не нужно. Реляционные базы данных (SQL именно так) работают с использованием отношений, и большую часть времени лучше всего назначать по одной строке таблицы каждому «биту информации». Например, где вы можете подумать:» мне нужен список вещей здесь», вместо этого создайте новую таблицу, связав строку в одной таблице со строкой в другой таблице.[1] таким образом, вы можете представлять отношения M:N. Другое преимущество что те ссылки не будут загромождать строку, содержащую связанный элемент. И база данных может индексировать эти строки. Массивы обычно не индексируются.

Если вам не нужны реляционные базы данных,вы можете использовать, например, хранилище ключей.

читать про нормализация базы данных, пожалуйста. Золотое правило: «[каждый] неключевой [атрибут] должен предоставить факт о ключе, весь ключ, и ничего, кроме ключа.». Массив слишком много. Он имеет несколько фактов и сохраняет порядок (который не связан с самим отношением). И производительность плохая (см. выше).

представьте, что у вас есть таблица человек и у вас есть таблица с телефонными звонками людей. Теперь вы можете сделать каждый человек row есть список его телефонных звонков. Но у каждого человека есть много других отношений ко многим другим вещам. Означает ли это, что моя таблица person должна содержать массив для каждой вещи, к которой он подключен? Нет, это не является атрибутом самого человека.

[1]: Это нормально, если таблица ссылок имеет только два столбца (первичные ключи из каждой таблицы)! Если сама связь имеет дополнительные атрибуты, они должны быть представлены в этой таблице в виде столбцов.

MySQL 5.7 теперь предоставляет тип данных JSON. Этот новый тип данных обеспечивает удобный новый способ хранения данных: списки, словари и т. д.

тем не менее, rrays не отображают хорошо базы данных, поэтому объектно-реляционные карты могут быть довольно сложными. Исторически люди сохраняли списки / массивы в MySQL, создавая таблицу, которая описывает их и добавляя каждое значение как свою собственную запись. В таблице может быть только 2 или 3 столбца, или она может содержать гораздо больше. Как вы храните этот тип данных зависит от характеристик данных.

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

кроме того, ключ: хранилища данных значения / хранилища документов, такие как Cassandra, MongoDB, Redis etc обеспечивает хорошее разрешение также. Просто имейте в виду, где данные фактически хранятся (если они хранятся на диске или в памяти). Не все ваши данные должны быть в одной базе данных. Некоторые данные плохо сопоставляются с реляционной базой данных, и у вас могут быть причины хранить их в другом месте, или вы можете использовать ключ в памяти:база данных значений в качестве горячего кэша для данных, хранящихся на диске где-то или в качестве эфемерного хранилища для таких вещей, как сеансы.

sidenote для рассмотрения, вы можете хранить массивы в Postgres.

в MySQL используйте тип JSON.

Contra ответы выше, стандарт SQL включал типы массивов в течение почти двадцати лет; они полезны, даже если MySQL не реализовал их.

в вашем примере, однако, вы, вероятно, захотите создать три таблицы: person и fruit, а затем person_fruit, чтобы присоединиться к ним.

Если вы хотите связать человека с массивом фруктов, вы можете сделать это с видом:

посмотреть показывает следующие данные:

В 5.7.22 вы захотите использовать JSON_ARRAYAGG, а не взломать массив вместе из строки.

используйте поле базы данных типа BLOB для хранения массивов.

Возвращаемые Значения

возвращает строку, содержащую байт-потоковое представление значения, которое может храниться где угодно.

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

вы можете сохранить свой массив с помощью group_Concat, как это

Источник

Сохранить массив PHP в MySQL?

каков хороший способ сохранить массив данных в одном поле mysql?

также, как только я запрошу этот массив в таблице mysql, что является хорошим способом вернуть его в форму массива?

Это сериализовать и восстановить ответ?

13 ответов

нет хороший способ хранения массива в одном поле.

необходимо изучить реляционные данные и внести соответствующие изменения в схему. См. пример ниже для ссылки на этот подход.

Читайте также:  ворона села на крышу

если вы должны сохраните массив в одно поле, затем serialize() и unserialize() функции сделают трюк. Но вы не можете выполнять запросы к фактическому содержимому.

рассмотрим следующий массив

чтобы сохранить его в базе данных, вам нужно создать такую таблицу

для работы с записями вы можете выполнять такие запросы, как эти (и да, это пример, будьте осторожны!)

на connect() функция возвращает соединение mysql ресурс

в целом, да, сериализовать и восстановить путь.

Если ваши данные-это что-то простое, сохранив как строку с разделителями-запятыми, вероятно, было бы лучше для хранения. Если вы знаете, что Ваш массив будет просто списком чисел, например, вы должны использовать implode / explode. Это разница между 1,2,3 и a:3: .

Если нет, то сериализовать и восстановить работу во всех случаях.

самый лучший способ, который я нашел для себя-это сохранить массив строковых данных через разделитель

затем вы можете искать данные, хранящиеся в массиве с простых запросов

используйте функцию explode () для преобразования строки «array_data» в array

обратите внимание, что это не работает с многомерными массивами и убедитесь, что ваш «array_separator» уникален и не существует значений в массиве.

просто используйте функцию сериализации PHP:

однако, если вы используете простые массивы, подобные этому, вы можете также использовать implode и explode.Используйте пустой массив вместо нового.

сериализовать/восстановить массив для хранения данных в БД

из руководства по PHP:

посмотреть в разделе «Возврат» на странице

возвращает строку, содержащую байт-потоковое представление значения, которое может храниться в любом месте.

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

Примечание: Если вы хотите сохранить html в blob, обязательно кодируйте его base64, или он может сломать функцию сериализации.

$YourSerializedData теперь готов к хранению в blob.

после получения данных из blob вам нужно base64_decode затем unserialize Пример декодирования:

сериализовать и восстановить довольно распространенная для этого. Вы также можете использовать JSON через json_encode и json_decode для менее специфичного для PHP формата.

Ух, я не знаю, почему все предлагают сериализовать массив.

Я говорю, лучший способ-на самом деле вписать его в схему базы данных. Я понятия не имею (и вы не дали никаких подсказок) о фактическом семантическом значении данных в вашем массиве, но обычно есть два способа хранения таких последовательностей

таким образом, вы сохраняете свой массив в одной строке.

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

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

Что касается его возвращения. Ну, получите соответствующую строку / последовательность строк с запросом и, ну, используйте цикл.. правильно?

Я бы предложил использовать implode / explode с символом, который, как вы знаете, не будет содержаться ни в одном из отдельных элементов массива. Затем сохраните его в SQL в виде строки.

проверьте функцию implode, так как значения находятся в массиве, вы хотите поместить значения массива в запрос mysql, который вставляет значения в таблицу.

Если значения в массиве являются текстовыми значениями, вам нужно будет добавить кавычки

кроме того, если вы не хотите дублировать значения, переключите «В» на «игнорировать», и в таблицу будут вставлены только уникальные значения.

вы можете сохранить массив как json.
существует документация для типа данных json:https://dev.mysql.com/doc/refman/5.7/en/json.html
Я думаю, что это лучшее решение и поможет вам поддерживать ваш код более читаемым, избегая сумасшедших функций.
Думаю, это вам поможет.

Ага, сериализовать/восстановить то, что я видел в многих проектах с открытым исходным кодом.

вместо сохранения в базе данных сохраните его в файл, а затем вызовите его позже.

что делают многие php-приложения (например, sugarcrm), это просто использовать var_export для Эха всех данных массива в файл. Это то, что я использую для сохранения данных конфигурации:

Я думаю, что это лучший способ сохранить ваши данные!

Источник

Как хранить массивы в базе данных

При работе с базой данных MySQL иногда нужно сохранить массив в одном поле. К сожалению, нет способа непосредственно передать массив как параметр. В результате, хранение таких структур данных становиться более сложным процессом, но, тем не менее, возможным.

Чтобы конвертировать любой массив (или объект) в строку в PHP, нужно вызвать функцию serialize :

$string содержит строчную версию массива. Выше приведенный пример выведет следующее:

Чтобы конвертировать такую строку обратно в массив, надо использовать unserialize :

Теперь проведём конвертацию массива из 200 случайно генерированных целых чисел в диапазоне от 1 до 1000:

Читайте также:  литвин что случилось сегодня

Пример выведет подобную строку:

Данная строка может быть сохранена в базе данных и конвертирована в массив по мере надобности. Очень часто функция base64_encode используется в сочетании с функцией serialize для хранения массивов:

Зашифрованная строка может быть восстановлена в массив с помощью функции base64_decode :

К сожалению, такие строки могут иметь очень большой размер. В таком случае можно использовать функцию gzcompress для сжатия строки (размер сжатой строки существенно меньше):

Вот и все, что может пригодиться при решении вопроса хранения массива в базе данных.

Данный урок подготовлен для вас командой сайта ruseller.com
Источник урока: www.lateralcode.com/store-array-database/
Перевел: Сергей Фастунов
Урок создан: 3 Сентября 2010
Просмотров: 92908
Правила перепечатки

5 последних уроков рубрики «PHP»

Фильтрация данных с помощью zend-filter

Когда речь идёт о безопасности веб-сайта, то фраза «фильтруйте всё, экранируйте всё» всегда будет актуальна. Сегодня поговорим о фильтрации данных.

Контекстное экранирование с помощью zend-escaper

Обеспечение безопасности веб-сайта — это не только защита от SQL инъекций, но и протекция от межсайтового скриптинга (XSS), межсайтовой подделки запросов (CSRF) и от других видов атак. В частности, вам нужно очень осторожно подходить к формированию HTML, CSS и JavaScript кода.

Подключение Zend модулей к Expressive

Expressive 2 поддерживает возможность подключения других ZF компонент по специальной схеме. Не всем нравится данное решение. В этой статье мы расскажем как улучшили процесс подключение нескольких модулей.

Совет: отправка информации в Google Analytics через API

Предположим, что вам необходимо отправить какую-то информацию в Google Analytics из серверного скрипта. Как это сделать. Ответ в этой заметке.

Подборка PHP песочниц

Подборка из нескольких видов PHP песочниц. На некоторых вы в режиме online сможете потестить свой код, но есть так же решения, которые можно внедрить на свой сайт.

Источник

Как в MySQL засунуть массивы?

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

php: serialize / unserialize
все так в основном делают.

Что бы потом не гемороится, лучше сделать так: В ячейке сохранять имя отдельной таблицы, в которую уже можно поместить массив. Так по крайней мере, на тебя не будут давлеть ни какие ограничения. Имя таблицы может генерироваться автоматически (это просто связка префикс-ID, где префикс нужен для того что бы такие таблицы можно было легко визуально отделить от остальной БД).
Кста, при большом количестве и размере массивов ты так выиграешь в скорости.

Или завести большую универсальную таблицу с полями (оба индексные): имя массива, индекс массива. + остальные поля, как данные ячеек массива. А ссылать на массив посредством указания его имени. Тут, по-хорошему, надо б ещё привлечь отношения таблиц 1 много, но не всегда это может оказаться позволительно.

DimaSun
Согласен, лучше чуть-чуть сменить дизайн базы и воспользоватся преимуществами sql запросов. Но лучше для массивов сделать одну таблицу и дифферинциировать массивы по некому полю. (хотя конечно зависит от)

Массивы могут иметь разную размерность, тут не очень удобно получится.

DimaSun
Вот что я имал в виду. Например пользователю нужно сопоставить массив целых чисел, делаем что-то типа этого:

CREATE TABLE user_ints
( user_id INT NOT NULL,
value INT NOT NULL,
INDEX(user_id)
);
Если нужно, можно ввести колонку определяющую порядок значений (локально для пользователя или глобально для таблицы), время создания и т.п.
Если индексировать и value, то можно быстро удалять сами значения не перебирая всех пользователей.

Это хорошо. А если массив двумерный? А если их несколько (Вообще в БД), и они действительно разной размерности?
Я думаю мы оба правы, но рассматриваем несколько разные случаи. 🙂 Мы не знаем конкретной задачи.

у базы данных не бывает полей произвольного размера. TEXT например занимает фиксированно 32 килобайта

с блобами та же история.
Только это _максимальный_ размер поля.
База не будет резервировать по 16 мегабайт для каждого mediumtext поля, как и 65 кб для обычного текстового. БД динамично места выделяет.

Если MySQL использовать из C++ с Unix компилятором gcc, то можно в поле TEXT, MEDIUMTEXT или LONGTEXT запихивать массив, как дам его памяти без serialize / unserialize, предварительно сделав addslashes.
А в PHP числа в переменных в наглую приводятся к текстовой записи, что часто не удобно.
Если массив короткий, то можно сделать в php числа через ‘;’ или ‘,’ в виде строки текста, как Wat написал. Но если нужно хранить огроменные массивы, то php’шный serialize на столько увеличивает память для его хранения, что #$#@@.

PRIMARY KEY (parentId, value)
)

Массив можно получать

Volodya
Мне думается что хранить массив в бинарном виде в PHP тоже можно. делать подобную «упаковку», если это те же числа.
по типу charint=chr((number>>24)&255).chr((number>>16)&255).chr((number>>8)&255).chr(number&255).
в обратную сторону преобразовывать через ord()

Источник

Обучающий онлайн портал