准备好了带有上层等的 MySQL 语句


Prepared MySQL statement with upper and like

我从:

$check = $db->prepare("SELECT `id`, `name` FROM `this_table` WHERE UPPER(`name`) LIKE ?")or die($db->error);

这不起作用,并且不返回任何行。尝试进一步研究,并得出:

$check = $db->prepare("SELECT `id`, `name` FROM `this_table` WHERE UPPER(`name`) LIKE CONCAT('%', ?, '%')")or die($db->error);

但也没有快乐。在所有大写和常规大小写中都尝试了我的参数。没有区别。如何将这三者结合起来?

您需要将 LIKE 作为包装在 % 中的变量传递:

$val = '%some-value%';
$q = $db->prepare("SELECT id, name FROM this_table WHERE UPPER(name) LIKE ?" );
$q->bindValue( 1, $val );

问:如何将这三者结合起来?

答:您的问题中没有足够的信息来了解您观察到的行为(准备失败并显示错误消息,执行失败并显示错误消息,执行成功,但 fetch 未返回任何行,或返回意外行...我们只是猜测。

您发布的两个 SQL 语句的语法似乎都是有效的。(根据提供的信息,我们无法验证标识符、数据类型、权限等。

我们注意到,如果name列是使用不区分大小写的排序规则定义的(即以 _ci 结尾的字符集,并且客户端字符集不区分大小写,则可能不需要使用 UPPER() 函数,但它是有效的。 (我们在这里猜测name列被定义为 VARCHAR 列,但同样,这实际上只是一个猜测。

为了保持一致性,我们有点希望 LIKE 比较的两边都包含在 UPPER(( 函数中......

SELECT t.id
     , t.name
  FROM `this_table` t
 WHERE UPPER(t.name) LIKE UPPER( ? )
       ^^^^^              ^^^^^

如果您期望通配符匹配,其中"abcd"的值将与"bc"匹配name则您需要在bindParam中提供的值将包含通配符。

如果您提供的值只是 'bc' ,则可以包含通配符,如第二个示例中所示,CONCAT函数和文字'%'字符。

SELECT t.id
     , t.name 
  FROM `this_table` t
 WHERE UPPER(t.name) LIKE CONCAT('%', UPPER( ? ), '%')
       ^^^^^                          ^^^^^

除此之外,我们只是根据您提供的信息猜测您观察到的行为。