SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 01.12.2015 20:57:16

marvitalik
Участник
Зарегистрирован: 01.12.2015
Сообщений: 11

Запись файла в поле BLOB - сохраняется не весь файл

Здравствуйте!
Пробую загрузить изображение в базу, поле в базе с типом LONGBLOB, файл заливается не до конца. Файлы маленькие - 50...500 Кб. Пробовал загружать через POST запрос и через phpMyAdmin - результат одинаков. Один и тот же файл при загрузке обрывается на том же месте. Разные файлы - на разных местах. Например, файл в 350 кб обрезается до 307 кб, 100 кб - до 90 кб. Символы, на которых идет обрезка данных, у каждого файла разные.  Перед загрузкой через POST пробовал различные варианты экранирования - addslashes, mysql_escape_string, mysql_real_escape_string - результат одинаков. Пробовал менять кодировку соединения с базой через mysql_query(«SET NAMES 'utf8'») и mysql_set_charset(«utf8») - не помогает. Естественно, облазил уже все поисковики - похожей проблемы не нашел. Попробовал на другом сервере - эти же скрипты и базы работают без проблем. Значит, проблема не в скриптах, а в настройках сервера. Но вот в каких? Сравнить настройки на удаленном сервере с моими настройками - нет возможности. Помогите советом. Где может быть у меня ошибочка?

Неактивен

 

#2 01.12.2015 21:10:37

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Запись файла в поле BLOB - сохраняется не весь файл

Почему нельзя сравнить настройки? Попробуйте
SHOW GLOBAL VARIABLES;
и разместите здесь.
Приведите также SHOW CREATE TABLE `имя_таблицы`;

Неактивен

 

#3 02.12.2015 13:08:21

marvitalik
Участник
Зарегистрирован: 01.12.2015
Сообщений: 11

Re: Запись файла в поле BLOB - сохраняется не весь файл

Благодарю за подсказку. А то я сразу хотел сравнивать файлы my.cnf smile

Во вложенном файле - вывод SHOW GLOBAL VARIABLES
колонка Remote - настройки удаленного сервера, где запись файла происходит нормально
колонка Local - мой сервер

Файл my.cnf моего сервера:
---------------------
[mysqld]
join_buffer_size = 128M
sort_buffer_size = 2M
read_rnd_buffer_size = 2M
max_allowed_packet = 2M
query_cache_type=1
query_cache_limit=2M
join_buffer_size=256M
innodb_buffer_pool_instances=1
#sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
sql_mode=TRADITIONAL
---------------------

SHOW CREATE TABLE `userdata`;
CREATE TABLE `userdata` ( 
`user_id` int(11) NOT NULL AUTO_INCREMENT, 
`login` varchar(40) NOT NULL, 
`pass` varchar(40) CHARACTER SET utf16 NOT NULL, 
`post_id` int(11) NOT NULL, 
`photo` mediumblob NOT NULL, 
`imgtype` varchar(20) NOT NULL, 
PRIMARY KEY (`user_id`),  UNIQUE KEY `login` (`login`),  KEY `post_id` (`post_id`))
ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8

Отредактированно marvitalik (02.12.2015 13:26:58)


Прикрепленные файлы:
Attachment Icon sql.xls, Размер: 58,880 байт, Скачано: 1,225

Неактивен

 

#4 02.12.2015 14:09:09

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Запись файла в поле BLOB - сохраняется не весь файл

Скорее всего проблем все-таки внутри скрипта PHP. Обрезание часто происходит при работе текстовых утилит, типа iconv, которые могут вести себя по-разному на разных версиях при разных настройках PHP. Попробуйте использовать addslashes() вместо mysql_escape_string().

Неактивен

 

#5 02.12.2015 14:16:00

marvitalik
Участник
Зарегистрирован: 01.12.2015
Сообщений: 11

Re: Запись файла в поле BLOB - сохраняется не весь файл

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

Неактивен

 

#6 02.12.2015 14:27:01

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Запись файла в поле BLOB - сохраняется не весь файл

Посмотрите еще на настройки httpd и хватает ли памяти. Попробуйте в скрипте, который обрабатывает POST проверить длину файла - сохранилась ли она?
print_r($_FILES)
После чтения содержимого файла в переменную напечатайте длину этой переменной. Потом сравните с тем, что попало в базу.

Неактивен

 

#7 02.12.2015 14:34:11

marvitalik
Участник
Зарегистрирован: 01.12.2015
Сообщений: 11

Re: Запись файла в поле BLOB - сохраняется не весь файл

httpd гляну, спасибо.
Памяти вроде должно хватать, несколько раз наблюдал, что показывает top - всегда было свободной памяти не менее 70...100 Мб, файл подкачки вообще не использовался (на сервере 2 Гб ОЗУ).
Размер файла в массиве $_FILES отображается правильный, это смотрел уже.
Пробовал загружать файл через POST на сервер, копировать в другую папку а потом уже оттуда считывать - то же самое.

Неактивен

 

#8 02.12.2015 14:41:56

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Запись файла в поле BLOB - сохраняется не весь файл

А длину строки после addslashes проверяли? Проверьте также длину итогового sql-запроса. Подозреваю, что где-то строка портится до отправки в базу данных.

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

Неактивен

 

#9 02.12.2015 14:53:22

marvitalik
Участник
Зарегистрирован: 01.12.2015
Сообщений: 11

Re: Запись файла в поле BLOB - сохраняется не весь файл

rgbeast написал:

А длину строки после addslashes проверяли? Проверьте также длину итогового sql-запроса. Подозреваю, что где-то строка портится до отправки в базу данных.

тоже посмотрю. Но думаю не в строке дело, т.к. на другом сервере срабатывает нормально, те же скрипты и те же базы.

rgbeast написал:

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

Да, те что после обрезки - тоже разные, смотрел на нескольких файлах.

Только что попробовал вставить текстовый файл с содержимым "test test ..." (500 kb) - вставляется нормально.
А если на русском "тест тест ..." - 502 кб режет до 203 кб
Если такой же на 175 кб загрузить - режет до 71 кб

Отредактированно marvitalik (02.12.2015 15:16:51)

Неактивен

 

#10 02.12.2015 16:04:44

marvitalik
Участник
Зарегистрирован: 01.12.2015
Сообщений: 11

Re: Запись файла в поле BLOB - сохраняется не весь файл

Подскажите, можно ли добавить файл в таблицу с полем BLOB через mysql консоль?
Чтобы попробовать миновать использование php.
Что-то мне начинает казаться, что собака зарыта в PHP, придется перекомпилировать.
вывод phpinfo()
PHP Version 5.5.11
...
Client API version     mysqlnd 5.0.11-dev - 20120503 - $Id: bf9ad53b11c9a57efdb1057292d73b928b8c5c77 $
...
это нормально?

Неактивен

 

#11 02.12.2015 16:16:25

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Запись файла в поле BLOB - сохраняется не весь файл

mysqlnd 5.0.11-dev: dev - означает, что это нестабильная версия PHP-MySQL клиента. Попробуйте обновить пакет php-mysql

А какая версия сервера MySQL?

Неактивен

 

#12 02.12.2015 17:12:25

marvitalik
Участник
Зарегистрирован: 01.12.2015
Сообщений: 11

Re: Запись файла в поле BLOB - сохраняется не весь файл

[root@server ~]# mysql -V
mysql  Ver 14.14 Distrib 5.6.17, for Linux (i686) using  EditLine wrapper

Неактивен

 

#13 02.12.2015 18:11:54

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Запись файла в поле BLOB - сохраняется не весь файл

Сервер нормальный, но может быть бага в нестабильной версии коннектора php-mysql. Как из консоли загрузить файл в blob не знаю

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson