Поиск по русским буквам в mysql (проблема "е" и "ё" в utf-8)

Была задача найти все слова, начинающиеся на определенную букву. Казалось бы, что может быть проще?)

Стоит отметить, что сайт на utf-8, таблицы в utf8_general_ci. Начал я с простого: для передачи ссылка (с GET запросом для сортировки по определенной букве, типа «http://sky2high.net/sort.php/?letter=Ю«) проходила через php-ое urlencode(), а на приеме через urldecode(), на выходе которого получаем необходимую букву.

Сначала скрипт выборки из БД был типа такого:

SELECT name, lat_name, video
FROM ru_words AS w
WHERE w.name LIKE "{$letter}%"
ORDER BY w.name

И всё бы хорошо, но БД выдавала одинаковые результаты для букв «е» и «ё». Тут я и впал в ступор, стал гуглить. Оказалось, что это ошибка mysql-server-5.0.xx, рекомендовали апгрейдить на 5.1 (а на боевом сервере стоит mysql 5.0.xxx), что, конечно, есть большой геморр, особенно в виду отсутствия deb-пакетов для ubuntu 8.04 LTS, что значит надо собирать из исходников, заново настраивать, импортировать БД и т.д..

Далее, вспомнил про прекрасный оператор REGEXP в SQL запросах (и правильно сделал! — прим. КО), однако запрос типа

SELECT name, lat_name, video
FROM ru_words AS w
WHERE w.name REGEXP "^{$letter}"
ORDER BY w.name"

Не дал результатов, то есть вообще никаких, слова перестали находится. Не знаю зачем (ведь перед глазами постоянно мелькало из документации «REGEXP ведет НЕ РЕГИСТРОЗАВИСИМЫЙ поиск»), но всё-таки попробовал передать в запросе поиск не по заглавной букве, но по прописной.

$letter = mb_strtolower((urldecode($letter), 'UTF-8')

И мини-чудо озарило мой экран: поиск стал просто идеально идти по всем буквам.

Выводы: даже и не знаю какие. Доверять, конечно, надо документации, но и проверять.

  • Понимаю, что времени много прошло, однако я откоменчу.
    Это действительно баг — библиотека regexp, используемая в MySQL, не полностью поддерживает юникод =(
    Эту проблему заметили уже давно (http://bugs.mysql.com/bug.php?id=1103 — 2003г.) и ответ разработчиков — Won’t fix.

  • Понимаю, что времени много прошло, однако я откоменчу.
    Это действительно баг — библиотека regexp, используемая в MySQL, не полностью поддерживает юникод =(
    Эту проблему заметили уже давно (http://bugs.mysql.com/bug.php?id=1103 — 2003г.) и ответ разработчиков — Won’t fix.

  • Понимаю, что времени много прошло, однако я откоменчу.
    Это действительно баг — библиотека regexp, используемая в MySQL, не полностью поддерживает юникод =(
    Эту проблему заметили уже давно (http://bugs.mysql.com/bug.php?id=1103 — 2003г.) и ответ разработчиков — Won’t fix.

  • Понимаю, что времени много прошло, однако я откоменчу.
    Это действительно баг — библиотека regexp, используемая в MySQL, не полностью поддерживает юникод =(
    Эту проблему заметили уже давно (http://bugs.mysql.com/bug.php?id=1103 — 2003г.) и ответ разработчиков — Won’t fix.

  • Но я читал, что в 5.1 вроде должны пофиксить, но у меня на серве это страшный геморр будет переводить на новую версию, поэтому не пробовал)

  • Но я читал, что в 5.1 вроде должны пофиксить, но у меня на серве это страшный геморр будет переводить на новую версию, поэтому не пробовал)

  • Dimitry

    Но я читал, что в 5.1 вроде должны пофиксить, но у меня на серве это страшный геморр будет переводить на новую версию, поэтому не пробовал)

  • Dimitry

    Но я читал, что в 5.1 вроде должны пофиксить, но у меня на серве это страшный геморр будет переводить на новую версию, поэтому не пробовал)

  • Roma

    как ты все таки сделал? чет у меня как Е и Ё выводит…

  • Roma

    как ты все таки сделал? чет у меня как Е и Ё выводит…

  • Через регулярные выражения и сделал.

  • Через регулярные выражения и сделал.