Поиск данных MySQL - PullRequest
       2

Поиск данных MySQL

1 голос
/ 08 июля 2010

Я пытаюсь выполнить поиск в базе данных MySQL с помощью ключа поиска, введенного пользователем. Мои данные содержат прописные и строчные буквы. Мой вопрос заключается в том, как сделать так, чтобы моя функция поиска не учитывала регистр символов. пример: data в mysql - BOOK, но если пользователь вводит книгу в поисковой строке. Результат не найден .... Спасибо ..

Мой поисковый код

$searchKey=$_POST['searchKey'];
$searchKey=mysql_real_escape_string($searchKey);

$result=mysql_query("SELECT *
            FROM product
            WHERE product_name like '%$searchKey%' ORDER BY product_id
                            ",$connection); 

Ответы [ 5 ]

3 голосов
/ 08 июля 2010

Просто введите строку поиска в верхнем регистре и сравните ее с полем верхнего регистра.

$searchKey= strtoupper($_POST['searchKey']);
$searchKey=mysql_real_escape_string($searchKey);

$result=mysql_query("SELECT * FROM product
        WHERE UPPER(product_name) like '%$searchKey%' ORDER BY product_id
         ",$connection); 
2 голосов
/ 08 июля 2010

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

Если ваши данные не нужно хранить в чувствительных к регистру столбцах, вам следует выбрать соответствующий параметр сортировки для таблицы или столбца.См. Мой ответ на , как я могу игнорировать верхний и нижний регистр различий при поиске с помощью mysql , чтобы узнать, как сопоставление влияет на чувствительность к регистру.запросы.Один использует UPPER, другой нет:

DROP TABLE IF EXISTS `table_a`;
CREATE TABLE `table_a` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `value` varchar(255) DEFAULT NULL,
  INDEX `value` (`value`),
  PRIMARY KEY (`id`)
) ENGINE=InnoDB;

INSERT INTO table_a (value) VALUES
('AAA'), ('BBB'), ('CCC'), ('DDD'),
('aaa'), ('bbb'), ('ccc'), ('ddd');

EXPLAIN SELECT id, value FROM table_a WHERE UPPER(value) = 'AAA';
+----+-------------+---------+-------+---------------+-------+---------+------+------+--------------------------+
| id | select_type | table   | type  | possible_keys | key   | key_len | ref  | rows | Extra                    |
+----+-------------+---------+-------+---------------+-------+---------+------+------+--------------------------+
|  1 | SIMPLE      | table_a | index | NULL          | value | 258     | NULL |    8 | Using where; Using index |
+----+-------------+---------+-------+---------------+-------+---------+------+------+--------------------------+

EXPLAIN SELECT id, value FROM table_a WHERE value = 'AAA';
+----+-------------+---------+------+---------------+-------+---------+-------+------+--------------------------+
| id | select_type | table   | type | possible_keys | key   | key_len | ref   | rows | Extra                    |
+----+-------------+---------+------+---------------+-------+---------+-------+------+--------------------------+
|  1 | SIMPLE      | table_a | ref  | value         | value | 258     | const |    2 | Using where; Using index |
+----+-------------+---------+------+---------------+-------+---------+-------+------+--------------------------+

Обратите внимание, что первый SELECT, использующий UPPER, должен сканировать все строки, тогда как второй должен сканировать только две - двеэтот матчВ таблице такого размера разница явно неощутима, но при большой таблице полное сканирование таблицы может серьезно повлиять на скорость вашего запроса.

1 голос
/ 08 июля 2010

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

Убедитесь, что у вас есть типы полей и правильный запрос (может быть, есть дополнительный пробел или что-то). Если это не сработает, вы можете преобразовать строку в верхний регистр в PHP (то есть: $str = strtoupper($str)) и сделать то же самое на стороне MySQL (@despart)

РЕДАКТИРОВАТЬ: я разместил статью выше (^). И я только что проверил это. Поиск по полям CHAR, VARCHAR и TEXT нечувствителен к регистру (collation = latin1)

1 голос
/ 08 июля 2010

Прежде всего, старайтесь избегать использования * в максимально возможной степени. Это вообще считается плохой идеей. Выберите столбцы, используя имена столбцов.

Теперь ваше решение будет -

$searchKey=strtoupper($_POST['searchKey']);
$searchKey=mysql_real_escape_string($searchKey);

$result=mysql_query("SELECT product_name,
                            // your other columns
                    FROM product
                    WHERE UPPER(product_name) like '%$searchKey%' ORDER BY product_id
                        ",$connection);

EDIT

Я попытаюсь объяснить, почему плохая идея использовать *. Предположим, вам нужно изменить схему таблицы продуктов (добавление / удаление столбцов). Затем столбцы, которые выбираются с помощью этого запроса, изменятся, что может вызвать непреднамеренные побочные эффекты и их будет трудно обнаружить.

1 голос
/ 08 июля 2010

Это простой способ сделать это:

$searchKey=strtoupper($searchKey);

SELECT *
FROM product
WHERE UPPER(product_name) like '%$searchKey%' ORDER BY product_id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...