Регистр в запросе учитывается - влияет ли сборка PHP или Mysql?

Тема в разделе "Как сделать...", создана пользователем Menro, 23 май 2018.

  1. Menro

    Menro web, seo, email, hack

    Регистр.:
    27 янв 2008
    Сообщения:
    681
    Симпатии:
    128
    Всем привет!
    Столкнулся тут с проблемой при работе с OpenCart 3.
    Ввожу запрос в форму поиска - Запрос - пусто
    Ввожу запрос в форму - запрос - получаю результаты.

    Делаю вывод, что учитывается регистр.
    Только вот фишка в том, что точно этот же сайт (полная копия) на другом серваке работает нормально.
    Поля по которым поиск работает имеют нужную кодировку utf8_general_ci. Всё точь в точь, кроме версий php/mysql.
    Связи с этим и вопрос, это может какая-то влиять?
    Ещё кстати, этот второй сервак где не работает поиск на Windows.

    Помогите советом, может ещё какие-то мысли?
     
  2. Den1xxx

    Den1xxx

    Moderator
    Регистр.:
    15 янв 2014
    Сообщения:
    278
    Симпатии:
    151
    При некоторых условиях регистр не учитывается под Windows
     
  3. Menro

    Menro web, seo, email, hack

    Регистр.:
    27 янв 2008
    Сообщения:
    681
    Симпатии:
    128
    Очень информативно..., но всё равно спасибо.
    Кстати, название товара у меня: Робот
    ,когда ищу Робот - не находит, а когда ищу робот - находит.
    То есть речь идет даже не о регистрозависимости. а о том, что не воспринимается верхний регистр.
     
  4. pautina

    pautina Постоялец

    Регистр.:
    15 фев 2010
    Сообщения:
    110
    Симпатии:
    35
    Единственное, что могу дать ссылку на офф. документацию:

    http://www.mysql.ru/docs/man/Case_sensitivity.html

    Думаю проблема в версии MySQL или же в кодировке самих данных, которые хранятся в таблице, так-как по умолчанию в Windows кодировка CP1251.

    Вот ссылка на подобную проблему. Что-бы полностью здесь все не писать - рекомендую прочитать и ознакомится, возможно это поможет вам решить проблему:

    https://www.linux.org.ru/forum/web-development/9004557
     
    Последнее редактирование: 25 май 2018
    Menro нравится это.
  5. deedjey

    deedjey Постоялец

    Регистр.:
    20 янв 2014
    Сообщения:
    73
    Симпатии:
    45
    А в базе с каким регистром запись? Может тогда форму ввода в поиске приводить к нижнему регистру всегда?
    PHP:
    mb_strtolower string $str [, string $encoding mb_internal_encoding() ] )
     
    Menro нравится это.
  6. Menro

    Menro web, seo, email, hack

    Регистр.:
    27 янв 2008
    Сообщения:
    681
    Симпатии:
    128
    В базе запись и в нижнем и в верхнем регистре, то есть написано: "Робот".
    За совет приводить к нижнему регистру спасибо, тоже так сразу думал, но что-то не получилось привести, не работ mb_strtolower в моём случае.
    В любом случае, способ не лучший, а поскольку на другом серваке всё исправно работает, решил спросить, может кто в курсе с чем это может быть связано.
     
  7. velwind

    velwind Создатель

    Регистр.:
    25 май 2018
    Сообщения:
    26
    Симпатии:
    7
    Покажите сам SQL запрос (или группу запросов), который ищет в базе по ключевому слову
     
  8. dwtxpm

    dwtxpm Писатель

    Регистр.:
    22 июн 2018
    Сообщения:
    0
    Симпатии:
    0
    Пробовал выполнять поисковый запрос непосредственно в базе?
     
  9. Freeman08

    Freeman08 Создатель

    Регистр.:
    27 сен 2008
    Сообщения:
    27
    Симпатии:
    7
    Все дело в кодировке таблицы/поля. Я в основном в проэктах использую кодировку utf8_general_ci . ci - означает case insensitive, что в переводе регистров независимый. utf8 не бывает регистров зависимым (к сожалению). Конечно же текст будет в базе храниться с разным регистром, так сказать как запишите так и будет, но поиск по тексту будет без учета регистра. Робот и робот выдадут одинаковые результаты.

    Если же нужна регистрозависимая выборка, то кодировку следует сменть на что то вроде latin1_general_cs , cs - case sensitive, что значит регистро зависимый (в отличии от utf8 бывает так же регистронезависимая кодировка latin1_general_ci)

    К примеру у нас есть таблица "users" с полями: id (автоинкремент), firstname, lastname
    В таблице "users", есть пользователи "Робот Валли" и "робот андроид"

    PHP:
    INSERT INTO users (`firstname`, `lastname`) VALUES ("Робот""Валли"), ("робот""андроид");

    если колонка "firstname" будет иметь кодировку "utf8_general_ci":

    PHP:
    SELECT FROM `usersWHERE `firstname` = 'Робот' ## вернет обе строки
    если колонка "firstname" будет иметь кодировку "latin1_general_cs":

    PHP:
    SELECT FROM `usersWHERE `firstname` = 'Робот' ## вернет одну строку, где робот написано с большой
     
    Последнее редактирование: 28 июн 2018
  10. dejurin

    dejurin Создатель

    Регистр.:
    16 июл 2012
    Сообщения:
    16
    Симпатии:
    12
    Обращение должно быть регистронезависимым.
    ВНИМАНИЕ! Начиная с MySQL 5.5.3 вы должны использовать utf8mb4, а не utf8. Оба они относятся к кодировке UTF-8, но более старый utf8 имеет ограничение, специфичное для MySQL, не позволяющее использовать символы, пронумерованные выше 0xFFFD.
    Данным фактом обычно пренебрегают.
     
    pautina и Menro нравится это.