Dec 04, 2008, 01:17 AM *
Welcome, Guest. Please login or register.
Did you miss your activation email?

Login with username, password and session length
Search via SMF or Google: modx forums all of modxcms.com web
  MODxCMS.com   Forums   Help Login Register  
Pages: [1] 2 3 4   Go Down
  Print  
Author Topic: [Solved, TIP!] Кириллица, UTF8 и MySQL  (Read 25669 times)
0 Members and 1 Guest are viewing this topic.
Fuzzy
Committed to MODx
*****
Posts: 696



WWW
« on: May 08, 2006, 07:11 AM »

Добрый день!
Помогите, если кто знает, как побороть проблемку с кодировками, в стандартной конфигурации в базе данных сохраняется абракадабра, если писать кириллицей. Однако вывод кода получается нормальным. Все бы ничего, да только при переносе базы с локалхоста на сервер там происходит чепуха и кириллица отображается коряво.
Нашел такое решение 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
« Last Edit: Dec 15, 2006, 10:00 AM by Igor » Logged

aleksey.stepanov
Committed to MODx
*****
Posts: 1,098



« Reply #1 on: May 08, 2006, 07:33 AM »

как я понял проблема возикает в момент переноса самой БД. смотри как у тебя файл *.sql формируется
Logged

разработка под MODx любой сложности.
Fuzzy
Committed to MODx
*****
Posts: 696



WWW
« Reply #2 on: May 08, 2006, 07:45 AM »

смотри как у тебя файл *.sql формируется
SQL файл формируется вроде бы нормально, т.е. кириллица так и отображается кириллицей. Подозреваю, что дело в том, что кодировка этого файла ANSI. Хотя в Notepad++ в формате кодировки стоит UTF8 без BOM и одновременно выбрана ANSI. Вот и не знаю, что думать Sad Приложил файл, можете посмотреть на 508 строке, там кириллица нормально отображается..

* modx_.zip (46.56 KB - downloaded 451 times.)
Logged

aleksey.stepanov
Committed to MODx
*****
Posts: 1,098



« Reply #3 on: May 08, 2006, 07:48 AM »

посмотрел он у тебя был в ANSI я взял банально его в UTF-8 перекодил.. попробуй загрузить на свой хостинг

* modx_utf8.zip (46.56 KB - downloaded 471 times.)
Logged

разработка под MODx любой сложности.
Fuzzy
Committed to MODx
*****
Posts: 696



WWW
« Reply #4 on: May 08, 2006, 10:58 AM »

посмотрел он у тебя был в ANSI я взял банально его в UTF-8 перекодил.. попробуй загрузить на свой хостинг
К сожалению, я это уже пробывал. Скачал этот файл, который ты перекодировал и попробовал загрузить на хостинг, результат тот же самый - одни вопросы ? ? ? ? ? в базе данных и соответственно на сайте. Думаю, что действительно проблема возникает именно при импорте данных. Только вот как ее решить - не знаю Sad Возможно это связано с настройками phpMyAdmin или самой БД, как думаешь?
« Last Edit: May 08, 2006, 11:13 AM by Igor » Logged

aleksey.stepanov
Committed to MODx
*****
Posts: 1,098



« Reply #5 on: May 08, 2006, 12:11 PM »

думаю если есть 100% уверенность в том что БД настроенно на UTF-8, то можно полагать что файл коверкаеться в момент загрузки. что может быть причиной?
1. сам phpMyAdmin конвертит (настройки выставлены на win1251)
2. Апачь коверкает (стоит какая-то принудительная переконвертация)

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

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

разработка под MODx любой сложности.
Fuzzy
Committed to MODx
*****
Posts: 696



WWW
« Reply #6 on: May 08, 2006, 01:57 PM »

УРАААА  Grin I DID IT Smiley Представьте, просидел несколько суток Smiley
Значит так.. Опишу, что сделал. Дабы народу помочь, если кому понадобится, да и самому не забыть опосля  Wink

1. Перед установкой MODx, ищем в папке install файл setup.sql и перед каждым TYPE=MyISAM добавляем  DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci . Например, чтобы вместо:
Code:
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.';
получилось примерно так:

Code:
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 строка)
Code:
// 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);
}
и заменяем на
Code:
// 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):
Code:
        
         if (!@ mysql_select_db($dbase)) {
            $modx->messageQuit("Failed to select the database '" . $dbase . "'!");
            exit;
         }
         $tend = $modx->getMicroTime();
И заменяем на следующий код:
Code:
         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:
Quote
перед каждым TYPE=MyISAM добавляем  DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci
Хотя возможно, что есть более универсальный подход, даже почти уверен, что есть, поскольку базу данных объемом в несколько мегабайт мне просто страшно представить, как редактировать Smiley Вот если у кого есть дельные мысли на этот счет, буду очень рад Smiley

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

P.S.: Сохраняя вложенность, приложил измененные файлы, о которых говорил выше по тексту. По идее, все, что требуется, перед установкой просто заменить ими имеющиеся директории. Прошу принять во внимание, что приложенные к сообщению файлы относятся к MODx версии 0.9.2.1. Поэтому в более новых версиях возможны какие-либо изменения в файловой структуре.

* modx-utf8.zip (19.54 KB - downloaded 525 times.)
« Last Edit: Sep 06, 2007, 01:35 AM by Igor » Logged

aleksey.stepanov
Committed to MODx
*****
Posts: 1,098



« Reply #7 on: May 08, 2006, 03:38 PM »

матеро Smiley

а все из-за того что БД по-умолчанию на cp1251 настроена?
Logged

разработка под MODx любой сложности.
Fuzzy
Committed to MODx
*****
Posts: 696



WWW
« Reply #8 on: May 08, 2006, 03:48 PM »

Quote
а все из-за того что БД по-умолчанию на cp1251 настроена?
В моем случае это обычно была кодировка latin1 и сравнение latin1_swedish_ci. Видимо влияют региональные настройки, что ли Smiley  Особенно парило latin1_swedish_ci. Никак не мог от него избавиться Smiley
Logged

Lord Daedra
Full Member
***
Posts: 237

I love MODx!


« Reply #9 on: May 20, 2006, 09:28 AM »

В файле my.cnf прописать (это у нас, пропишите какие вам надо)

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

[client]
default-character-set=cp1251
Logged
Fuzzy
Committed to MODx
*****
Posts: 696



WWW
« Reply #10 on: May 20, 2006, 11:01 AM »

В файле my.cnf прописать (это у нас, пропишите какие вам надо)

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

[client]
default-character-set=cp1251
Согласен, это все правильно, только для разных хостингов разные настройки. У меня вот например на компьютере тоже стояла кодировка базы данных UTF-8, как я считал, однако скрипты работали с collation latin1_swedish_ci. Ну это конечно из-за личного незнания. Но я к тому говорю, что трудно предугадать, как настроен MySQL на сервере хостера. Я например когда искал решение, описанное выше, экспериментировал как со своим удаленным сервером (там настроена кодировка UTF8) и локальным компьютером, так и с буржуйским хостером, который вроде бы тоже поддерживал UTF-8, однако упорно ставил collation latin1_swedish_ci.
Logged

max.rogalsky
Jr. Member
*
Posts: 32


WWW
« Reply #11 on: May 30, 2006, 05:09 PM »

А у меня такие бока - кодировка ср1251. Сайт (http://sun-city.com.ua) показывается нормально. А вот в админке - дерево документов да и сами документы непонятно в какой кодировке.
Logged

MODx Ukraine
Fuzzy
Committed to MODx
*****
Posts: 696



WWW
« Reply #12 on: May 30, 2006, 10:46 PM »

rogalsky, а у тебя какая кодировка стоит в самой системе? Если используешь ср1251, то в настройках системы надо выбрать кодировку Cyrillic (Windows) - windows1251.
Logged

max.rogalsky
Jr. Member
*
Posts: 32


WWW
« Reply #13 on: May 31, 2006, 10:29 AM »

character_set_*=cp1251 (где * = client, connection, database, results, server)
character_set_system=utf8
collation_* = cp1251_general_ci (где * = connection, database, server)

на всех таблицах - ENGINE=MyISAM DEFAULT CHARSET=cp1251
в MODx - windows-1251

На Denwer-2 - все пашет как положено. На хосте в дереве документов - такого плана все записи Рћ Болгар