Как правильно извлечь массив из БД

F
На сайте с 06.02.2012
Offline
124
866

Никогда раньше не пробовал хранить массивы в БД, и тут столкнулся с проблемой.

Имею массив $arr.

$arr_ser = serialize($arr) поместил в ячейку arr таблицы базы. Вижу его там в PHPmyAdmin

Потом извлёк, вижу его на странице echo $arr_ser=data[arr] в том же упорядоченном виде.

Но $arr=unserialize( $arr_ser ) выдаёт пустоту. т.е print_r($arr) не выводится совсем. Массива нету. Пропал... Почему??

Экранировка mysql_real_escape_string($arr) перед записью в базу не помогла.

Ладно. Не понимаю куда он делся.. Закодировал перед отправкой в базу base64_encode($arr_ser)

Ура. Массив сохраняется. Но! раскодируется base64_decode($arr_ser) и далее unserialize( $arr_ser ) в крокозябрах.

На сайте и в базе кодировка 1251. Проблем с кодировкой в этих таблицах не было. Попробовал в базе ячейку arr поменять UTF8 - не помогло, выводит другие кракозябры.

Есть ли какие критерии для base64_decode по кодировке?

Что можно сделать в моём случае?

L
На сайте с 07.12.2007
Offline
351
#1

Поле какой тип имеет, BLOB? Его размер - достаточен, не обрезается при записи?

Если поле не BLOB, то просто менять в базе ячейку arr на UTF8 недостаточно, надо после подключения к БД делать:

"SET NAMES 'utf8'" // Отдавать/принимать данные в кодировке UTF-8

или, если по полю есть поиск:

"SET NAMES 'utf8' COLLATE 'utf8_general_ci'"); // Отдавать/принимать данные в кодировке UTF-8, сравнение в БД в UTF8

Или даже настраивать соединение с БД более тонко:

"SET character_set_client ='utf8'"); // В какой кодировке будут поступать данные от клиента
"SET character_set_connection ='cp1251'"); // В какую кодировку преобразовать полученные от клиента данные перед выполнением запроса
"SET collation_connection ='cp1251_general_ci'"); // Каким образом сравнивать между собой строки в запросах

Или просто сделайте поле типа BLOB - они хранятся и возвращаются "as is", то есть, в 'двоичном виде' и смена кодировок запросами выше на них не действуют.

F
На сайте с 06.02.2012
Offline
124
#2

Влезает serialize($arr) целиком , двумерный массив в конце две фигурных скобки на месте.

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

Но хранить массивом мне было бы удобнее для последующей его обработки другим скриптом.

Попробую скрипты в блокнотах utf8 обрабатывать.

---------- Добавлено 08.10.2015 в 13:16 ----------

В принципе для хранения данных разницы не вижу разницы в какой кодировке ячейка.

При выводе на странице прописал mysql_query("SET NAMES cp1251"); и всё выводится нормально в кирилице. Проблем не было.

Сейчас в ячейку utf8 запихал русский текст, нормально из неё выводится на страницу 1251 при наличии mysql_query("SET NAMES cp1251");.

Только при кодировке base64_ теперь вылез косяк.

---------- Добавлено 08.10.2015 в 13:23 ----------

Ladycharm:
оле какой тип имеет, BLOB?

Нет. Текстовое. TEXT

---------- Добавлено 08.10.2015 в 14:32 ----------

Пока удалось выводить base64_ кирилицей только на страницы Utf8 .

При чём, без разницы в какой кодировке была установлена текстовая ячейка.

Но массив и заливался в таблицу и парсился со страницы Utf8.

Но это уже хорошо.

Мне массивы нужны лишь для обработки. На сайте используется готовые переменные.

F
На сайте с 06.02.2012
Offline
124
#3

И не все массивы потом остаются целыми. Некоторые не удаётся получить.

Т.е, процедура хранения массивов в базе ненадёжна сама по себе?

F
На сайте с 06.02.2012
Offline
124
#4

В общем проблема решилась преобразованием массива в строку json_encode($arr, JSON_UNESCAPED_UNICODE).

Всё работает, все массивы целы, проблем с кирилицей тоже нет.

С сериалайзом так ничего и не добился. Сплошные косяки.

siv1987
На сайте с 02.04.2009
Offline
427
#5
fordzon:
С сериалайзом так ничего и не добился. Сплошные косяки.

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

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий