如何在PHP/MySQL中进行不区分大小写的SELECT查询?

12

这是我的问题,我猜它真的很基础。

我尝试在数据库中查找一行是否存在。这是我的代码:

$req="SELECT * FROM INSTITUTS WHERE inst_name='$fc_inst'";
$result=mysql_query($req) or die ('Erreur :'.mysql_error());
if (mysql_num_rows($result)){
echo '  name exist';
}
else {
echo '  does not exist.';
}

问题是,当我搜索“test”时,它说不存在,即使我在我的数据库中有“Test”。


3
默认情况下,MySQL的查询不区分大小写,除非底层表有一个区分大小写的排序规则设置。 - Marc B
7个回答

16

你可以使用LIKE

WHERE foo LIKE 'bar'

或者你可以将它们都转换为小写字母:

WHERE LOWER(foo) = LOWER("bar")

LOWER() 的示例最有效的情况是您知道数据库中所有数据已经转换为小写,然后您只需执行以下操作:

WHERE foo = LOWER("bar")

如果您可以将数据库中的所有数据转换为小写字母,那么这个比较会比使用LIKE更便宜。


1
我确定在某些领域,某些信息必须是大写或混合大小写的,而不能全部小写。 - Naftali

11
尝试使用LIKE而不是=:
$req="SELECT * FROM INSTITUTS WHERE `inst_name` LIKE '$fc_inst'";

这会起作用吗?他在语句中不应该使用Lower(),在PHP代码中也不应该使用strtolower()吗? - Damian Leszczyński - Vash
@Vash,这是一个问题还是陈述? - Naftali
1
MySQL通常在LIKE查询中不区分大小写,除非您特意设置为区分大小写。 - stevecomrie
@Vash:这不是MySQL引擎的工作方式,而是SQL的事情。请查看此问题:https://dev59.com/znVC5IYBdhLWcg3w4Vb6。 - ypercubeᵀᴹ

5

这可能与您的表COLLATE设置有关。

使用此CREATE语句,即使在使用LIKE运算符时,您的选择查询也将强制区分大小写:

CREATE
  table instituts (inst_name VARCHAR(64))
  CHARACTER SET latin1 COLLATE latin1_general_cs;

而这个将确保不区分大小写:

CREATE
  table instituts (inst_name VARCHAR(64))
  CHARACTER SET latin1

2
这可能是最明智的答案。 - Álvaro González

4
你可以像其他人告诉你的那样使用“LIKE”来解决它,但是重要的是要知道大小写敏感性是由数据库中的排序规则决定的。例如,如果您选择了utf8_general_ci排序规则...那么结尾的“ci”表示“不区分大小写”,因此您将来进行的比较将不区分大小写。 简而言之:您必须小心选择排序规则。

3

如果您想进行区分大小写的选择,可以使用MD5()比较:

$req="SELECT * FROM INSTITUTS WHERE MD5(inst_name)=MD5('$fc_inst')";

当然,你会消耗一点服务器的CPU,但这比那些无聊的比较要简单得多。


如果表格很大且查询频繁,"服务器的一点点CPU"可能意味着几个小时的CPU时间。 - ypercubeᵀᴹ

0

您可以在查询中使用LIKE BINARY。

像这样:

SELECT * FROM table_name WHERE column_name LIKE BINARY 'search_string'

这将区分大小写地检查“search_string”数据。


0

尝试:

$req="SELECT * FROM INSTITUTS WHERE UCASE(inst_name)=UCASE('$fc_inst')";
$result=mysql_query($req) or die ('Erreur :'.mysql_error());
if (mysql_num_rows($result)){
echo '  name exist';
}
else {
echo '  does not exist.';
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接