За последние 24 часа нас посетили 16836 программистов и 1315 роботов. Сейчас ищут 1508 программистов ...

Регистронезависимый поиск в MySQL

Тема в разделе "PHP и базы данных", создана пользователем virabhadra, 15 янв 2007.

  1. virabhadra

    virabhadra Активный пользователь

    С нами с:
    11 дек 2006
    Сообщения:
    127
    Симпатии:
    0
    Адрес:
    Praha, Czech Republic
    У меня база данных, кодировка utf-8.

    Если в базе данных есть слова написанные только латинскими буквами, то все нормально, например:
    есть слово "River", так если ищешь слово "river", то оно находится.

    Как только использую диакритические знаки, то начинаются проблемы, например:
    есть слово "Řeka" и если ищешь слово "řeka", то оно его не находит.

    Т.е. я понял, что если буквы не из латиницы, то заглавные и строчные, при поиске считаются разными буквами.

    Для поиска использую директиву REGEXP в SQL-запросе, например:
    SELECT * FROM table WHERE keywords REGEXP 'Řeka';

    Может быть кто-то знает как с этим быть? :roll:
     
  2. vasa_c

    vasa_c Активный пользователь

    С нами с:
    22 мар 2006
    Сообщения:
    1.760
    Симпатии:
    0
    Адрес:
    гор.Ленинград
    collation настрой на нужный язык.
     
  3. virabhadra

    virabhadra Активный пользователь

    С нами с:
    11 дек 2006
    Сообщения:
    127
    Симпатии:
    0
    Адрес:
    Praha, Czech Republic
    Неа, не помагает. Все варианты collation попробывал.
     
  4. vasa_c

    vasa_c Активный пользователь

    С нами с:
    22 мар 2006
    Сообщения:
    1.760
    Симпатии:
    0
    Адрес:
    гор.Ленинград
    Значит не все. Řeka это на каком языке?
     
  5. virabhadra

    virabhadra Активный пользователь

    С нами с:
    11 дек 2006
    Сообщения:
    127
    Симпатии:
    0
    Адрес:
    Praha, Czech Republic
    Это чешский язык. (Слово означает "река")
    Проблема еще в том, что таких букв в чешском алфавите много:
    Á Č Ď É Ě Í Ň Ó Ř Š Ť Ú Ů Ý Ž
    плюс те же строчные
     
  6. virabhadra

    virabhadra Активный пользователь

    С нами с:
    11 дек 2006
    Сообщения:
    127
    Симпатии:
    0
    Адрес:
    Praha, Czech Republic
    У меня есть идея, сделать функцию, которая будет все эти буквы в строке поиска переписывать так, например:
    'Řeka' на '(Ř|ř|r)(É|é|e)k(Á|á|a)'
    Не будет ли от этого поиск слишком громоздкий?
     
  7. vasa_c

    vasa_c Активный пользователь

    С нами с:
    22 мар 2006
    Сообщения:
    1.760
    Симпатии:
    0
    Адрес:
    гор.Ленинград
    utf_czech_ci пробовал?
     
  8. virabhadra

    virabhadra Активный пользователь

    С нами с:
    11 дек 2006
    Сообщения:
    127
    Симпатии:
    0
    Адрес:
    Praha, Czech Republic
    Пробовал. Его первым как раз и пробовал. Не помогает.
    Тип таблицы MyISAM, поиск веду в поле, тип которого TEXT.
    Еще раньше вычитал в документации, что с помощью collation можно настроить сортировку. Хотел, чтобы было как в чешском алфавите:
    A B C Č D Ď E F ... и т.д.
    включил опцию utf_czech_ci, но он сортирует сначала чистую латиницу, а потом отдельно то, что с диакритикой, т.е. так же как и utf8_general_ci:
    A B C D ... Y Z Č Ď ... Ž

    Короче говоря utf_czech_ci не помагает или я чего-то упустил.
     
  9. draak

    draak Guest

    SELECT * FROM table WHERE UPPEER(keywords) = UPPER('Řeka');
    может так
     
  10. virabhadra

    virabhadra Активный пользователь

    С нами с:
    11 дек 2006
    Сообщения:
    127
    Симпатии:
    0
    Адрес:
    Praha, Czech Republic
    draak, спасибо! Это тоже вариант. :)
    В моей конкретной задаче я решил это иначе.
    Вся графа ключевых слов у меня в нижнем регистре и поиск происходит только по нижнему регистру.
    Но, потом я буду еще добавлять поиск по именам, так там ваш вариант как раз может пригодиться.