2016-12-13 4 views
0

Когда я запрашиваю базу данных моего продукта, я получаю неполные результаты (как в PHP, так и в PhPMyAdmin).Запрос MySQL с LIKE возвращает неполные результаты

Таблица продуктов большая (159 колонок и в настоящее время 8000 строк). В одном столбце содержится название/название продукта (VARCHAR 255).

Вот некоторые из продуктов:

  • Royal Club Wild Orange
  • Royal Club Bitter лимон
  • Royal Club Ginger Ale
  • Royal Club Тоник

В PhpMyAdmin когда это Я запрашиваю таблицу:

SELECT * FROM `Nevo_Nutrient_Gehaltes` 
WHERE `Product_omschrijving` LIKE '%royal%' 
ORDER BY `Product_omschrijving` ASC 

я получаю в результате:

  • Royal Club Wild Orange

но не другие продукты ...

В PhpMyAdmin, когда я запрашиваю таблицу:

SELECT * FROM `Nevo_Nutrient_Gehaltes` 
WHERE `Product_omschrijving` LIKE '%club%' 
ORDER BY `Product_omschrijving` ASC 

Получать результаты:

  • Royal Club Wild Orange
  • Royal Club Bitter лимон
  • Royal Club Ginger Ale
  • Royal Club Тоник

В PhpMyAdmin, когда я запрашиваю таблицу:

SELECT * FROM `Nevo_Nutrient_Gehaltes` 
WHERE `Product_omschrijving` LIKE '%bitter%' 
ORDER BY `Product_omschrijving` ASC 

Я получаю результат: нет продуктов ...

Есть ли у кого-нибудь идеи, что может быть основной проблемой?

Я пытаюсь выяснить, что происходит. Возможно, что-то с настройкой в ​​базе данных или количеством столбцов?

дополнение (Jan четвёртой 2017)

Я также использую эту таблицу в прогнозирующей функции поиска (с JQuery автозаполнения). Я поставил усеченную версию здесь:

http://www.personalbodycenter.nl/zzz_predictive_search.php

При просмотре исходного кода страницы вы можете увидеть, что поле availableTags содержит все продукты, которые находятся в MySql таблицы «Nevo_Nutrient_Gehaltes».

Теперь, когда вы вводите «королевский» в поле, вы получаете то же самое 9 (но неполное, должно быть 17), которое вы получите при запросе таблицы непосредственно в PhPMyAdmin.

Когда вы вводите «клуб» в текстовое поле, вы получаете все значения, которые вы должны получить из таблицы. И вы можете видеть, что в списке есть больше результатов с «королевским». Они также должны появиться, когда вы наберете «королевский»!

Как могут те же самые неполные результаты возникать через запрос mysql, а также через функцию jquery ?! Я могу ошибаться, но эти разные способы доступа к информации не должны быть связаны?

Я уже сделал много экспериментов с таблицей в PhpMyAdmin за счет уменьшения таблицы 2 колонки, изменяя параметры сортировки, изменяя движок базы данных, но не повезло до сих пор ...

Я поместил базу данных на месте тестирования, поэтому, если кто-то чувствует, что они могут мне помочь, войдя в PhPMyAdminto, просмотрите эту таблицу и посмотрите, что здесь происходит, я могу предоставить данные для входа ...

+1

См. Http://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-me-to-be-a-very-simple- sql-query – Strawberry

+0

Это может помочь показать нам схему таблицы. Я предполагаю, что эта проблема связана с кодировкой/сортировкой, в которой хранится таблица. –

+1

моя догадка 'Product_omschrijving' не содержит слова, которые вы ищете, так как это« Описание », а не название продукта, может быть, вам нужно изменить это, чтобы быть другим столбцом? – cmorrissey

ответ

0

После долгих часов земляных работ и экспериментируют я обнаружил, что основная проблема здесь скрытые символы в таблице MySQL.

В основном специфический скрытый «неразрывный пробел» символ, который подполз в раскольнических слов данных (например, когда я использовал utf8_encode для кодирования строки в PHP он показал:. RoyÂal

Эти символы были invissible в PhpMyAdmin и в списке для функции интеллектуального поиска), но они были там (!), что привело к неполным результатам (например, запрос с LIKE «% Royal%» отбросил их).

Я написал follow up question here, как бороться с этими скрытыми символами.

1

По умолчанию LIKE выполняет сравнение с регистром , Возможно, ваши значения столбцов имеют разные случаи. Не могли бы вы попробовать следующий запрос:

SELECT 
    * 
FROM 
    Nevo_Nutrient_Gehaltes 
WHERE 
    lower(Product_omschrijving) LIKE '%royal%' 
ORDER BY 
    Product_omschrijving ASC 
+2

Это только регистр, если строка хранится в базе данных в кодировке, чувствительной к регистру. Из [docs] (https://dev.mysql.com/doc/refman/5.7/en/string-comparison-functions.html): «Сравнение строк не чувствительно к регистру, если только один из операндов не чувствителен к регистру (использует регистр с учетом регистра или представляет собой двоичную строку) « –

+0

Согласовано. Но мы еще не знаем структуру таблицы. –

+0

Спасибо за ваш ответ, но чувствительность к регистру - это не те проблемы, которые я пробовал уже –

Смежные вопросы