Subscribe: RSS
  • Добрый день!
    Помогите, если кто знает, как побороть проблемку с кодировками, в стандартной конфигурации в базе данных сохраняется абракадабра, если писать кириллицей. Однако вывод кода получается нормальным. Все бы ничего, да только при переносе базы с локалхоста на сервер там происходит чепуха и кириллица отображается коряво.
    Нашел такое решение http://modxcms.com/forums/index.php/topic,3584.0.html Поначалу казалось идеальным, т.к. в базе данных на локальном компьютере все сохранялось в нормальной кодировке и через phpMyAdmin читались символы замечательно. Однако снова при переносе БД на сервер появились проблемы, теперь уже вместо кириллицы стоят знаки вопроса ? ? ? ? Замучался уже.. sad Кто с этим сталкивался и как решил проблемку?

    Конфигурация локального сервера:
    1. Windows XP SP2
    Apache 2.0
    PHP 5
    MySQL 4.1, кодировка UTF8 (насколько я знаю, MySQL 4.0 не поддерживает полностью UTF8)
    phpMyAdmin 2.6.4-pl1

    2. Пробовал на линуксе Ubuntu 5.10, результат тот же, конфигурация сервера:
    Apache 2.0
    PHP 5
    MySQL 4.1
    phpMyAdmin 2.6.2-Debian-3sarge1

    Хостинг FreeBSD 5.4
    Apache 2.0
    PHP 5
    MySQL 4.1, кодировка UTF8
    phpMyAdmin 2.6.4
      Разработка сайтов и программных модулей на MODX.
      Опыт работы на MODx с 2005 года. Высокое качество.
      Компания Baltic Design Colors: http://www.bdcolors.ru.
    • как я понял проблема возикает в момент переноса самой БД. смотри как у тебя файл *.sql формируется
        "Und wenn du lange in einen Abgrund blickst, blickt der Abgrund auch in dich hinein."

        Не используйте Revo для "просто сайтов". Используйте Evo

        Who can defeat the Russian bear?
      • Quote from: aleksey.stepanov at May 08, 2006, 12:33 PM

        смотри как у тебя файл *.sql формируется
        SQL файл формируется вроде бы нормально, т.е. кириллица так и отображается кириллицей. Подозреваю, что дело в том, что кодировка этого файла ANSI. Хотя в Notepad++ в формате кодировки стоит UTF8 без BOM и одновременно выбрана ANSI. Вот и не знаю, что думать sad Приложил файл, можете посмотреть на 508 строке, там кириллица нормально отображается..
          Разработка сайтов и программных модулей на MODX.
          Опыт работы на MODx с 2005 года. Высокое качество.
          Компания Baltic Design Colors: http://www.bdcolors.ru.
        • посмотрел он у тебя был в ANSI я взял банально его в UTF-8 перекодил.. попробуй загрузить на свой хостинг
            "Und wenn du lange in einen Abgrund blickst, blickt der Abgrund auch in dich hinein."

            Не используйте Revo для "просто сайтов". Используйте Evo

            Who can defeat the Russian bear?
          • Quote from: aleksey.stepanov at May 08, 2006, 12:48 PM

            посмотрел он у тебя был в ANSI я взял банально его в UTF-8 перекодил.. попробуй загрузить на свой хостинг
            К сожалению, я это уже пробывал. Скачал этот файл, который ты перекодировал и попробовал загрузить на хостинг, результат тот же самый - одни вопросы ? ? ? ? ? в базе данных и соответственно на сайте. Думаю, что действительно проблема возникает именно при импорте данных. Только вот как ее решить - не знаю sad Возможно это связано с настройками phpMyAdmin или самой БД, как думаешь?
              Разработка сайтов и программных модулей на MODX.
              Опыт работы на MODx с 2005 года. Высокое качество.
              Компания Baltic Design Colors: http://www.bdcolors.ru.
            • думаю если есть 100% уверенность в том что БД настроенно на UTF-8, то можно полагать что файл коверкаеться в момент загрузки. что может быть причиной?
              1. сам phpMyAdmin конвертит (настройки выставлены на win1251)
              2. Апачь коверкает (стоит какая-то принудительная переконвертация)

              второй вариант менее правдопадобен. имхо...

              у phpMyAdmin когда подключаешься к базе есть параметр установик кодировки. надо его курить.
                "Und wenn du lange in einen Abgrund blickst, blickt der Abgrund auch in dich hinein."

                Не используйте Revo для "просто сайтов". Используйте Evo

                Who can defeat the Russian bear?
              • УРАААА grin I DID IT smiley Представьте, просидел несколько суток smiley
                Значит так.. Опишу, что сделал. Дабы народу помочь, если кому понадобится, да и самому не забыть опосля wink

                1. Перед установкой MODx, ищем в папке install файл setup.sql и перед каждым TYPE=MyISAM добавляем DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci . Например, чтобы вместо:
                CREATE TABLE IF NOT EXISTS `{PREFIX}active_users` (
                  `internalKey` int(9) NOT NULL default '0',
                  `username` varchar(50) NOT NULL default '',
                  `lasthit` int(20) NOT NULL default '0',
                  `id` int(10) default NULL,
                  `action` varchar(10) NOT NULL default '',
                  `ip` varchar(20) NOT NULL default '',
                  PRIMARY KEY  (`internalKey`)
                ) TYPE=MyISAM COMMENT='Contains data about active users.';
                

                получилось примерно так:

                CREATE TABLE IF NOT EXISTS `{PREFIX}active_users` (
                  `internalKey` int(9) NOT NULL default '0',
                  `username` varchar(50) NOT NULL default '',
                  `lasthit` int(20) NOT NULL default '0',
                  `id` int(10) default NULL,
                  `action` varchar(10) NOT NULL default '',
                  `ip` varchar(20) NOT NULL default '',
                  PRIMARY KEY  (`internalKey`)
                ) DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci TYPE=MyISAM COMMENT='Contains data about active users.';
                


                P.S.: Проще всего использовать замену ") TYPE" на ") DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci TYPE"
                P.S.2: Таким образом мы принудительно заставляем базу данных использовать кодировку UTF8 независимо от того, какие настройки выставлены для нее по умолчанию.

                2. Находим в папке manager файл index.php. В нем находим (примерно 133 строка)
                // connect to the database
                if(@!$modxDBConn = mysql_connect($database_server, $database_user, $database_password)) {
                	die("<h2>Failed to create the database connection!</h2>. Please run the MODx <a href='../install'>install utility</a>");
                } else {
                    mysql_select_db($dbase);
                }
                

                и заменяем на
                // connect to the database
                if(@!$modxDBConn = mysql_connect($database_server, $database_user, $database_password)) {
                	die("<h2>Failed to create the database connection!</h2>. Please run the MODx <a href='../install'>install utility</a>");
                } else {
                    mysql_select_db($dbase);
                    mysql_query("SET NAMES 'utf8';",$modxDBConn);
                    mysql_query("SET CHARACTER SET 'utf8';",$modxDBConn);
                    mysql_query("SET SESSION collation_connection = 'utf8_general_ci';",$modxDBConn);
                }
                


                3. Проделываем похожую процедуру с файлом manager/includes/extenders/dbapi.mysql.class.inc.php:
                Находим в файле dbapi.mysql.class.inc.php (примерно 90 строка, функция connect):
                         
                         if (!@ mysql_select_db($dbase)) {
                            $modx->messageQuit("Failed to select the database '" . $dbase . "'!");
                            exit;
                         }
                         $tend = $modx->getMicroTime();
                

                И заменяем на следующий код:
                         if (!@ mysql_select_db($dbase)) {
                            $modx->messageQuit("Failed to select the database '" . $dbase . "'!");
                            exit;
                         }
                         mysql_query("SET NAMES 'utf8';", $this->conn);
                         mysql_query("SET character_set_results = 'utf8';", $this->conn);
                         mysql_query("SET collation_connection = 'utf8_general_ci';", $this->conn);
                         $tend = $modx->getMicroTime();
                


                Итак, мы готовы к установке этой замечательной безо всякого преувеличения CMS smiley Собственно, дальше установка, настройка и заполнение информацией.

                ВАЖНО: Сразу после установки системы вы попадаете в раздел настроек, где необходимо выбрать кодировку, которую будете использовать в системе. Выбирайте Unicode (UTF8) - utf-8.

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

                Так вот, проблема заключалась опять же в необходимости принудительно заставлять базу данных на хостинге работать с кодировкой UTF8. На данный момент я нашел пока единственное решение - это полученный дамп базы из phpMyAdmin редактировать вручную и проделывать то же самое, как я описывал в пункте 1:

                перед каждым TYPE=MyISAM добавляем DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci
                Хотя возможно, что есть более универсальный подход, даже почти уверен, что есть, поскольку базу данных объемом в несколько мегабайт мне просто страшно представить, как редактировать smiley Вот если у кого есть дельные мысли на этот счет, буду очень рад smiley

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

                P.S.: Сохраняя вложенность, приложил измененные файлы, о которых говорил выше по тексту. По идее, все, что требуется, перед установкой просто заменить ими имеющиеся директории. Прошу принять во внимание, что приложенные к сообщению файлы относятся к MODx версии 0.9.2.1. Поэтому в более новых версиях возможны какие-либо изменения в файловой структуре.
                  Разработка сайтов и программных модулей на MODX.
                  Опыт работы на MODx с 2005 года. Высокое качество.
                  Компания Baltic Design Colors: http://www.bdcolors.ru.
                • матеро smiley

                  а все из-за того что БД по-умолчанию на cp1251 настроена?
                    "Und wenn du lange in einen Abgrund blickst, blickt der Abgrund auch in dich hinein."

                    Не используйте Revo для "просто сайтов". Используйте Evo

                    Who can defeat the Russian bear?
                  • а все из-за того что БД по-умолчанию на cp1251 настроена?
                    В моем случае это обычно была кодировка latin1 и сравнение latin1_swedish_ci. Видимо влияют региональные настройки, что ли smiley Особенно парило latin1_swedish_ci. Никак не мог от него избавиться smiley
                      Разработка сайтов и программных модулей на MODX.
                      Опыт работы на MODx с 2005 года. Высокое качество.
                      Компания Baltic Design Colors: http://www.bdcolors.ru.
                    • В файле my.cnf прописать (это у нас, пропишите какие вам надо)

                      [mysqld]
                      old_passwords
                      init-connect="SET NAMES cp1251"
                      character-set-server=cp1251
                      collation-server=cp1251_general_ci

                      [client]
                      default-character-set=cp1251