Всем привет,
Использую drupal 4.6 модуль image (v 1.146.2.14 2006/02/23 04:06:33 walkah)
При добавлении материала типа image содержащий символы кирилицы, эта информация не попадает в поисковую систему drupal.
Если в описание изображения символы латиницы то все работает как надо, но с русским проблемы.
Чтобы разобраться в чем проблема посмотрел содержимое таблицы search_index. Там на самом деле в таблицы отсутствовали записи о нодах с символами кирилицы.
Подскажите хотя бы куда копать и как drupal обновляет таблицу search_index.
Всем спасибо за любые мысли.
P.S. MySQL работает в UTF8
Комментарии
Я тоже обратил внимание на подобные проблемы (http://drupal.ru/node/1680), но я не использую модуль search, а использую trip_search, который ищет без этих дополнительных индексных таблиц.
Главное не ясно, на каком уровне решать эту проблему, либо с MySQL траблы, либо SELECT надо не так писать или еще что-то...
я вроде разобрался в .htaccess должно быть
php_value magic_quotes_gpc 0
php_value register_globals 0
php_value session.auto_start 0
php_value mbstring.language Russian
php_value mbstring.internal_encoding UTF-8
php_value mbstring.http_output UTF-8
php_value mbstring.http_input auto
php_value output_handler mb_output_handler
php_value default_charset UTF-8
# php_value mbstring.substitute_character none
php_value mbstring.func_overload 6
Только с этими настройками если создавать новый сайт поиск работает. Если делать upload базы данных на сервер, то какие то глюки лезут. Сообщения об ошибке типа
warning: array_keys(): The first argument should be an array in /var/www/virtual/ruscor.ru/htdocs/ruscor/includes/menu.inc on line 916.
warning: Wrong parameter count for min() in /var/www/virtual/ruscor.ru/htdocs/ruscor/includes/menu.inc on line 916.
warning: array_key_exists(): The second argument should be either an array or an object in /var/www/virtual/ruscor.ru/htdocs/ruscor/includes/menu.inc on line 920.
Кроме того надо в файле database.mysql.inc внести изменения:
function db_connect($url) {
$url = parse_url($url);
// Allow for non-standard MySQL port.
if (isset($url['port'])) {
$url['host'] = $url['host'] .':'. $url['port'];
}
$connection = mysql_connect($url['host'], $url['user'], $url['pass'], TRUE) or die(mysql_error());
mysql_select_db(substr($url['path'], 1), $connection) or die('unable to select database');
return $connection;
}
Заменить на
function db_connect($url) {
$url = parse_url($url);
// Allow for non-standard MySQL port.
if (isset($url['port'])) {
$url['host'] = $url['host'] .':'. $url['port'];
}
$connection = mysql_connect($url['host'], $url['user'], $url['pass'], TRUE) or die(mysql_error());
mysql_query("SET NAMES 'utf8'");
mysql_query("SET collation_connection='utf8_general_ci'");
mysql_query("SET collation_server='utf8_general_ci'");
mysql_query("SET character_set_client='utf8'");
mysql_query("SET character_set_connection='utf8'");
mysql_query("SET character_set_results='utf8'");
mysql_query("SET character_set_server='utf8'");
mysql_select_db(substr($url['path'], 1), $connection) or die('unable to select database');
return $connection;
}
что интересно на windows все работает и без этих изменений. Но unix хостинг требует эти изменения.
Так же нужно очистить таблицу cache.
To axel наверно было бы не плохо добавить это в FAQ, потому что вопрос настройки кирилицы поднимается периодически каждый 2 месяца за последние 2 года, на этом и родственных сайтах.
А вот эти SET комманды разве надо выполнять каждый раз при коннекте ? Разве не достаточно их один раз выполнить после создания базы данных в качестве инициализации ?
ИМХО достаточно только
mysql_query('SET NAMES utf8');
mysql_query('SET CHARACTER_SET utf8');
(во всяком случае у меня так...), но только при пустой базе. Если добавить эти строки после начала заполнения контента, то лезли какие-то непонятные ошибки...
Дабавить эти строки с самого начала - все работает без проблем... Вроде как и поиск даже работает
Вероятне всего ошибки из-за того, что контент был не в UTF-8 забит (а как Latin1), а при добавлении
SET NAMES
MySQL возвращал его перекодированным в UTF... Со всеми вытекающими.Тут написано немного про
SET NAMES
:Так что вышеприведённый код слегка избыточен.
У меня поиск (я про
search.module
вообще) c кирилицей заработал когда перешёл на MySQL 4.1 и немного изменил includes\database.mysql.inc:В моём случае этого оказалось достаточно как для Windows, так и для Linux. Само собой, что это ещё от настроек сервера зависит и возможны вариации (типа вызова
SET CHARACTER SET
).Ах да, чуть не забыл, это всё относится к Drupal 4.6.х.
Да, есть такое ... вытекающих много
Теперь вопрос - как все это дело провернуть для сайта, на котором очень немеряно всего, и все это очень нужное и убиват ьнельзя.
Что если экспортнуть это все в виде скрипта, потом сделать необходимые изменения, а потом пересоздать таблицы и все залить заново ?