Добро пожаловать на сайт <БагБД>, где вы можете задавать вопросы о программировании и разработке на Битрикс и Битрикс24, и получать быстрые и квалифицированные ответы от профессионалов!

Не работает поиск

00 голосов
8
Поиск выдает ошибку:

File: /home/nomet/WWW/bitrix/modules/search/classes/general/search.php
Line: 201
MySQL Query Error: SELECT sc.ID ,sc.MODULE_ID ,sc.ITEM_ID ,sc.LID ,sc.TITLE ,sc.TAGS ,sc.BODY ,sc.SEARCHABLE_CONTENT ,sc.PARAM1 ,sc.PARAM2 ,sc.UPD ,sc.DATE_FROM ,sc.DATE_TO ,L.DIR ,L.SERVER_NAME ,sc.URL as URL ,stt.TF as RANK ,scsite.URL as SITE_URL ,scsite.SITE_ID ,DATE_FORMAT(sc.DATE_CHANGE, '%d.%m.%Y %H:%i:%s') as FULL_DATE_CHANGE ,DATE_FORMAT(sc.DATE_CHANGE, '%d.%m.%Y') as DATE_CHANGE FROM b_search_content sc INNER JOIN b_search_content_site scsite ON sc.ID=scsite.SEARCH_CONTENT_ID INNER JOIN b_lang L ON scsite.SITE_ID=L.LID INNER JOIN ( select st0.search_content_id, st0.TF, st0.TF RANK from b_search_content_stem st0 where st0.language_id = 'ru' and st0.stem in ('12') and st0.TF >= 0.23 ) stt ON sc.id = stt.search_content_id WHERE ((1=1)) AND scsite.SITE_ID = 's1' AND ( ( (sc.DATE_FROM IS NULL) OR sc.DATE_FROM <= '2011-01-19 14:36:53' ) AND ( (sc.DATE_TO IS NULL) OR sc.DATE_TO >= '2011-01-19 14:36:53' ) ) AND ( ( sc.MODULE_ID = 'main' AND (((sc.URL LIKE '/%' OR scsite.URL LIKE '/%')))) OR( sc.MODULE_ID = 'iblock' AND sc.PARAM1 = 'special') ) ORDER BY CUSTOM_RANK DESC, RANK DESC, sc.DATE_CHANGE DESC LIMIT 500[Illegal mix of collations (utf8_general_ci,IMPLICIT) and (utf8_unicode_ci,IMPLICIT) for operation '=']

Может кто-нибудь знает от чего это происходит?
Используется стандартный компонент поиска.
спросил 27 Май, 13 от Xsana (240 баллов)

8 Ответы

00 голосов
Цитата
Елена Рудакова пишет:
Illegal mix of collations (utf8_general_ci,IMPLICIT) and (utf8_unicode_ci,IMPLICIT) for operation '='
Попросите тех.специалистов привести таблички к единой кодировке utf8_general_ci или utf8_unicode_ci
Наверно так....
ответил 27 Май, 13 от sickmind (4,660 баллов)
00 голосов
все таблицы utf8_general_ci..
ответил 28 Май, 13 от Xsana (240 баллов)
00 голосов
Цитата
Елена Рудакова пишет:
все таблицы utf8_general_ci..

просто в части таблиц есть строки с другим сравнением (collation)
Я уже сталкивался с подобным, пришлось по все базе пробегать - проверять
ответил 24 Авг, 13 от Oggi (520 баллов)
00 голосов
и по таблицам по всем пробежалась, сравнение там тоже utf8_general_ci.
и Сопоставление соединения с MySQL utf8_general_ci.
некоторые таблицы были utf8_unicode_ci, я меняла на utf8_general_ci, но ничего не изменилось.
может как-то обновить надо?
ответил 22 Ноя, 13 от Xsana (240 баллов)
00 голосов
нужно изменить сравнение (collation) как у таблиц, так и у полей в таблицах. В все привести к одинаковому collation
Сейчас может быть такая ситуация, что таблица имеет collation utf8_general_ci, а часть полей в ней имеет сравнение utf8_unicode_ci отсюда и ошибки.
Проверьте еще раз внимательно. Пройдитесь в phpmyadmin по все таблицам, заходя в каждую
ответил 03 Март, 14 от Oggi (520 баллов)
00 голосов
в таблицах все ок.
может имеют значения переменные?
character set client utf8
(Глобальное значение) cp1251
character set connection utf8
(Глобальное значение) cp1251
character set database cp1251

character set results utf8
(Глобальное значение) cp1251
character set server cp1251
character set system utf8

collation connection utf8_general_ci
(Глобальное значение) cp1251_general_ci
collation database cp1251_general_ci
collation server cp1251_general_ci
ответил 23 Июнь, 14 от Xsana (240 баллов)
00 голосов
Нет, глобальные переменные тут не при чем. В сообщении об ошибке прямо написано, что используется два сравнения "[Illegal mix of collations (utf8_general_ci,IMPLICIT) and (utf8_unicode_ci,IMPLICIT)". Нужно искать именно их
ответил 23 Окт, 14 от Oggi (520 баллов)
00 голосов
Скриптик для глобальной переделки кодировки во всех таблицах и полях:
Код
$needCollation = 'utf8_general_ci'; // укажите здесь нужную кодировку

$res = $DB->Query('SHOW TABLE STATUS');
while($ts = $res->fetch()) {
    if ($ts['Collation'] != $needCollation) $DB->Query('ALTER TABLE `' . $ts['Name'] . '` DEFAULT CHARACTER SET utf8 COLLATE ' . $needCollation);

    $r2 = $DB->Query('SHOW FULL COLUMNS FROM ' . $ts['Name'] . ' WHERE Collation IS NOT NULL');
    while($col = $r2->fetch()) {
   if ($col['Collation'] != $needCollation) $DB->Query('ALTER TABLE `' . $ts['Name'] . '` CHANGE `' . $col['Field'] . '` `' . $col['Field'] . '` ' . $col['Type'] . ' CHARACTER SET utf8 COLLATE ' . $needCollation . ($col['Null'] == 'NO' ? ' NOT' : '') . ' NULL');
    }
}
ответил 22 Фев, 15 от shiva (100 баллов)

Похожие вопросы

0 голосов
1 ответ
0 голосов
2 ответов
0 голосов
5 ответов
спросил 11 Ноя, 13 от JIapro (180 баллов)
0 голосов
3 ответов
спросил 05 Сен, 13 от Mexx (140 баллов)
0 голосов
1 ответ