Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Мистическая ошибка с кодировкой при записи. Прошу гуру помощи.
 
 автор: Modder   (24.08.2014 в 02:06)   письмо автору
 
 

Проблема очень нестандартная и странная.

При записи данных (а именно строка с кирилицей в UTF-8) в БД (таблица InnoDB utf8_general_ci) иногда(!) русские буквы записываются вот такими кракозябрами Александр.
Записываемые исходные данные нормальные в UTF-8.
Язык PHP.

Кодировки везде установлены правильные. mysql_set_charset() использую. SET NAMES 'utf-8' тоже пробовал. Но это всё не то. Потому как проблема возникает иногда!

Какие особенности появления этой ситуации я заметил?
1. Если только что коряво записанные данные сразу же считать из БД и вывести на экран, то они нормальные! Т.е. в том же PHP скрипте при том же подключении к БД.
2. Почему-то проблема появляется в таблицах, к которым давно (где-то сутки или пол суток) не производился запрос на запись. После этой первой ошибочной записи, все последующие запросы проходят без проблем.
3. Проблема замечена только в двух таблицах из всех. Таблицы не маленькие по полям. В одной 50 столбцов, в другой - 100. Записей в них не много. Данные - обычные тексты (VARCHAR, CHAR) да числа (INT, MEDIUMINT, TINYINT), пару ENUM, и по-одному TIME и DATE.

Прошу специалистов MySQL большущей помощи!

  Ответить  
 
 автор: Valick   (24.08.2014 в 09:40)   письмо автору
 
   для: Modder   (24.08.2014 в 02:06)
 

проверяйте кодировки своих файлов (должно быть UTF-8 без BOM), проверяйте логику подключаемых файлов, которые тоже должны быть UTF-8 без BOM, а так же файлы не должны содержать никакого вывода в браузер до <?php и после ?> обычно где-то забывают пробелы или переводы строки, а это уже вывод контента в браузер.
Точно ли у вас единое подключение к БД, возможно их есколько и кодировки отличаются?

  Ответить  
 
 автор: Modder   (24.08.2014 в 12:10)   письмо автору
 
   для: Valick   (24.08.2014 в 09:40)
 

Valick, это всё типичные ошибки. С этим всё как надо. Поэтому и пишу что ошибка необычная.
Подключение одно, кодировка одна.

  Ответить  
 
 автор: Valick   (24.08.2014 в 12:28)   письмо автору
 
   для: Modder   (24.08.2014 в 12:10)
 

судя по моему горькому опыту - чудес не бывает ;)
где-то что-то упущено

  Ответить  
 
 автор: Modder   (24.08.2014 в 14:02)   письмо автору
 
   для: Valick   (24.08.2014 в 12:28)
 

Valick, не отрицаю что что-то упущено. Но только не в этом.

  Ответить  
 
 автор: Modder   (30.08.2014 в 01:23)   письмо автору
 
   для: Modder   (24.08.2014 в 02:06)
 

Решено! Проблема была в чрезмерной экономии хостинг провайдера. А именно в мизерных настройках MySQL.
Их можно отобразить SQL командой:
SHOW VARIABLES

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

Во-вторых, параметр wait_timeout был равен 15! Это значит, что если между SQL запросами бальше 15 секунд, то текущее MySQL соединение закрывается, а когда делаешь следующий запрос, соединение создаётся снова, но уже с кодировкой по умолчанию!

Это решается либо просьбой хостера поднять этот параметр до вменяемого значения, либо можно сделать это самому командой:
SET wait_timeout = 28800

P.S. Ох уж эти хостинги...

  Ответить  
 
 автор: Valick   (30.08.2014 в 05:16)   письмо автору
 
   для: Modder   (30.08.2014 в 01:23)
 

15 секунд между запросами - это вечность по меркам MySQL для обычного соединения.
15 секунд это с огромным запасом для вменяемого времени выполнения веб скрипта, а учитывая то, что хорошим тоном будет использование оператора закрытия соединения с БД после всех запросов для формирования страницы, перед непосредственным формированием этой самой страницы и выводом её в браузер, не дожидаясь окончания работы скрипта когда соединение закрывается автоматически, то 15 секунд - это вечность в квадрате.
Количество одновременно подключенных пользователей к базе данных - это тоже вещь не безразмерная и на фоне этого ваши SET wait_timeout = 28800 , просто как контрольный в голову.
Ну и в конце концов есть запрос на установку постоянного соединения с БД, для использования которого нужны веские причины, а большинство авторов книг, не вдаваясь в подробности, просто предостерегают от использования постоянного соединения.

  Ответить  
 
 автор: Modder   (01.09.2014 в 01:45)   письмо автору
 
   для: Valick   (30.08.2014 в 05:16)
 

Valick, для запросов MySQL это и много, но не для PHP скрипта.
Соединение используется не постоянное! И корректно закрывается в конце скрипта оператором, о котором вы пишите.
Значение 28800 - по умолчанию. Изучайте документацию http://dev.mysql.com/doc/refman/5.1/en/server-system-variables.html#sysvar_wait_timeout.
А проблема была в том, что наш скрипт общается с API сервером, и иногда приходится ждать ответа от API, ожидание которого может превышать 15 секунд. При этом соединение с MySQL висит. Вот и все дела.

  Ответить  
 
 автор: Valick   (01.09.2014 в 07:48)   письмо автору
 
   для: Modder   (01.09.2014 в 01:45)
 

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

  Ответить  
 
 автор: Trianon   (30.08.2014 в 10:39)   письмо автору
 
   для: Modder   (30.08.2014 в 01:23)
 

то есть Вы использовали постоянное соединение?
И ни словом об этом не обмолвились?
Вот уж и вправду - контрольный в голову...

  Ответить  
 
 автор: Modder   (01.09.2014 в 01:48)   письмо автору
 
   для: Trianon   (30.08.2014 в 10:39)
 

Trianon, постоянное соединение не используется! Поэтому и не обмолвился.
Описание ситуации читайте выше.
И нечего контролить голову.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования