搜索MySQL数据

时间:2010-07-08 13:57:12

标签: php mysql search

我正在尝试使用用户输入的搜索键搜索MySQL数据库。我的数据包含大写和小写。我的问题是如何使我的搜索功能不区分大小写。例如:mysql中的数据是BOOK,但是如果用户在搜索输入中输入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 个答案:

答案 0 :(得分:3)

将搜索字符串大写,并将其与大写字段进行比较。

$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); 

答案 1 :(得分:2)

如果可能,您应该避免使用UPPER作为此问题的解决方案,因为它会导致将每行中的值转换为大写的开销,以及MySQL无法使用任何索引的开销可能就在那一栏上。

如果您的数据不需要存储在区分大小写的列中,则应为表或列选择适当的排序规则。有关排序规则如何影响区分大小写的示例,请参阅我对how i can ignore the difference upper and lower case in search with mysql的回答。

以下显示了两个查询的EXPLAIN SELECT结果。一个使用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必须扫描所有行,而第二个只需扫描两个 - 两个匹配。在这个大小的表上,差异显然是难以察觉的,但是对于大表,全表扫描会严重影响查询的速度。

答案 2 :(得分:1)

这是一种简单的方法:

$searchKey=strtoupper($searchKey);

SELECT *
FROM product
WHERE UPPER(product_name) like '%$searchKey%' ORDER BY product_id

答案 3 :(得分:1)

首先,尽量避免使用*。这通常被认为是一个坏主意。使用列名选择列。

现在,您的解决方案将是 -

$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);

修改

我将尝试解释为什么使用*是个坏主意。假设您需要更改产品表的架构(添加/删除列)。然后,通过此查询选择的列将更改,这可能会导致意外的副作用,并且难以检测。

答案 4 :(得分:1)

根据MySQL manual,搜索中的区分大小写取决于使用的排序规则,默认情况下非二进制字段应区分大小写。

确保您拥有字段类型和查询权限(可能还有额外的空格或其他内容)。如果这不起作用,你可以在PHP中将字符串转换为大写(即:$str = strtoupper($str))并在MySQL端执行相同的操作(@despart)

编辑:我发布了上面的文章(^)。我刚试过它。对CHAR,VARCHAR和TEXT字段的搜索不区分大小写(collat​​ion = latin1)