![]() |
![]() |
Задавайте вопросы, мы ответим
Вы не зашли.
Всем доброго времени!
Имеется MySQL 5.1.32 под Linux в кодировке utf8 (и система, и БД, и таблицы).
Конструкция ...where name REGEXP '^qwe' честно возвращает и qwerty, и Qwerty.
Конструкция ...where name REGEXP '^абв' возвращает только абвгд.
Конструкция ...where name REGEXP '^Абв' возвращает только Абвгд.
Просьба проверить.
Собственно вопрос - как иначе организовать поиск в кириллице без учета регистра?
Неактивен
Сам себе ответил - LIKE работает без учета регистра - вроде раньше не так было?
Неактивен
LIKE использует collation, по умолчанию utf8 использует utf8_generic_ci.
ci == case insensitive. А вот с регулярными выражениями — беда. Они
используют библиотеку, которая плохо разбирается в кодировках. В
частности RLIKE должен быть не чувствительным к регистру, но на практике
он не чувствителен только для латинских букв
Неактивен
Спасибо!
Если я правильно понимаю, то установка collation в utf8_general_cs заставит LIKE учитывать регистр?
И еще - где-то проскакивало, что REGEXP работает быстрее LIKE - так ли это?
Неактивен
Сопоставление, учитывающее регистр, называется utf8_bin.
LIKE может использовать индекс, если ищет по началу строки (например,
LIKE 'word%'), REGEXP не использует индекс никогда. Так что утверждение
сомнительное
Неактивен
Понял, еще раз спасибо!
Неактивен
Проставил utf8_bin базе,таблице и полю...
Ни LIKE,ни REGEXP не работают без учета регистра,даже с лат. символами.
Подскажите пожалуйста,в чем может быть проблема?
Версия сервера: 5.0.77-log
до того,как менял collation, REGEXP работал без учета регистра только с лат. символами,как и у автора сабжа.
UPDATE:
Извиняюсь, заранее не попробовал LIKE...
Вернул все обратно,на general_ci... LIKE -работает,как надо. странно.
спасибо большое за инфу) надеюсь никто на такие же грабли больше не наступит.
Отредактированно freamer (09.12.2009 18:21:01)
Неактивен
такой трюк нашел
$val = mb_strtolower($val,'UTF-8');
LOWER(text_name) REGEXP '[[:<:]]{$val}[[:>:]]'
ну '[[:<:]]{$val}[[:>:]]' это уже мне нужно было
Неактивен