我正在尝试使用用户输入的搜索键搜索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);
答案 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字段的搜索不区分大小写(collation = latin1)