使Mysql查询案例不敏感

时间:2013-11-24 21:54:46

标签: php mysql case-insensitive

是否可以使以下查询字符串不区分大小写?

SELECT SUBSTR(raw,INSTR(raw,'".$term."') - 50,350) as term,
(LENGTH(raw) - LENGTH(REPLACE(raw,'".$term."',''))) /LENGTH('".$term."') AS occur,name,title 
FROM ( 
     SELECT ( LENGTH(raw) - LENGTH(REPLACE(raw,'".$term."','')) ) / LENGTH('".$term."') AS occur, raw, consol.name,title 
     FROM consol 
     WHERE LENGTH(raw) - LENGTH(REPLACE(raw,'".$term."',''))>0 AND raw LIKE '%".$term."%' COLLATE utf8_general_ci ORDER BY occur DESC 
     ) t ";

该表的引擎是MyISAM,编码是UTF8。当我从命令行运行查询时,它可以工作,但是当我通过浏览器执行它时会抛出以下错误。

  

注意:查询失败:COLLATION'utf8_general_ci'对于

中的CHARACTER SET'latin1'无效

该表以UTF-8编码,其核对是utf8_general_ci。如何确保查询“小”匹配小,小或小?

2 个答案:

答案 0 :(得分:1)

在将strtolower()变量添加到您的查询之前,使用$term或类似规范来规范化。{/ p>

答案 1 :(得分:0)

看起来好像第二个select语句中的WHERE子句导致了问题。我改变了这个:

WHERE LENGTH(raw) - LENGTH(REPLACE(raw,'".$term."',''))>0 AND raw LIKE '%".$term."%' COLLATE utf8_general_ci ORDER BY occur DESC

对此:

WHERE raw LIKE '%".$term."%' ORDER BY occur DESC

现在似乎与所有结果相符。初始查询过滤来自第二个查询的匹配。看起来LENGTH(raw) - LENGTH(REPLACE(raw,'".$term."',''))>0的WHERE条件导致了问题以及整理的设置。