Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Мистическая ошибка с кодировкой при записи, Прошу гуру помощи 
V
    Опции темы
Modder
  Дата 24.8.2014, 00:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 4.1.2008

Репутация: нет
Всего: нет



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

При записи данных (а именно строка с кирилицей в 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 большущей помощи!
PM   Вверх
Romikgy
Дата 24.8.2014, 11:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: нет
Всего: 146



имхо PHP генерит код HTML для юзера , какой чарсет стоит на этой html странице?


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Modder
Дата 24.8.2014, 11:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 4.1.2008

Репутация: нет
Всего: нет



Romikgy, все стандарные вопросы с одинаковыми кодировками в базах, файлах, подключении, html и т.д. не актуальны. С этим всё впорядке.
Поэтому и пишу что ошибка необычная.
PM   Вверх
AVA12
Дата 24.8.2014, 14:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 135
Регистрация: 4.5.2008

Репутация: нет
Всего: 4



Гм, а какая внутренняя кодировка используется в PHP? Какое значение у параметра mbstring.internal_encoding? Где и с каким параметром вызывается (и вызывается ли) mb_internal_encoding()?

Цитата
Таблицы не маленькие по полям. В одной 50 столбцов, в другой - 100.

50 полей - это уже перебор. В виде полей нужно хранить те данные, которые могут быть использованы для поиска и связей таблиц, а остальные сериализовать и пихать в блоб или текст.
PM ICQ Jabber   Вверх
Modder
Дата 24.8.2014, 14:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 4.1.2008

Репутация: нет
Всего: нет



AVA12, 
внутренняя кодировка в PHP естественно UTF-8.
mb_internal_encoding('UTF-8') вызывается вначале PHP скрипта.
PM   Вверх
Modder
Дата 30.8.2014, 00:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 4.1.2008

Репутация: нет
Всего: нет



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

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

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

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

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

Это сообщение отредактировал(а) Modder - 30.8.2014, 00:26
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MySQL | Следующая тема »


 




[ Время генерации скрипта: 0.0548 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.